c# - ReadOnlyCollection property underlying Collection is modified while iterating -
i have following property:
private static collection<assembly> _loadedassemblies = new collection<assembly>();     internal static readonlycollection<assembly> loadedassemblies     {         { return new readonlycollection<assembly>(_loadedassemblies); }     } in class loop through loadedassemblies
foreach (assembly assembly in resourceloader.loadedassemblies) while looping through assemblies underlying collection (_loadedassemblies) changes gives system.invalidoperationexception. preferred way make loadedassemblies safe? cannot reproduce problem can't try it.
is okay do?
internal static readonlycollection<assembly> loadedassemblies     {         { return new readonlycollection<assembly>(_loadedassemblies.tolist()); }     } edit
    public static void initialize()     {          foreach (assembly assembly in appdomain.currentdomain.getassemblies())         {             addassembly(assembly);         }         appdomain currentdomain = appdomain.currentdomain;         currentdomain.assemblyload += onassemblyload;     }      private static void onassemblyload(object sender, assemblyloadeventargs args)     {         addassembly(args.loadedassembly);     }      private static void addassembly(assembly assembly)     {         assemblyname assemblyname = new assemblyname(assembly.fullname);         string modulename = assemblyname.name;          if (!_doesnotendwith.exists(x => modulename.endswith(x, stringcomparison.ordinalignorecase)) &&             _startswith.exists(x => modulename.startswith(x, stringcomparison.ordinalignorecase)))         {             if (!_loadedassemblies.contains(assembly))             {                 _loadedassemblies.add(assembly);             }         }     } 
the suggestion have in question work. is:
internal static readonlycollection<assembly> loadedassemblies {     { return new readonlycollection<assembly>(_loadedassemblies.tolist()); } } the reason problems come _loadedassemblies being changed while enumerating on it. of course happens because readonlycollection wrapper around _loadedassemblies uses enumerator of base collection.
if _loadedassemblies.tolist() create new list copy of original _loadedassemblies. have same elements @ time of creation never updated again (since don't have reference new collection unable modify it). means when _loadedassemblies updated new list inside readonlycollection blissfully unaware of change , enumeration continue without problem end.
Comments
Post a Comment