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

Popular posts from this blog

android - InAppBilling registering BroadcastReceiver in AndroidManifest -

python Tkinter Capturing keyboard events save as one single string -

sql server - Why does Linq-to-SQL add unnecessary COUNT()? -