2009-12-16 4 views

risposta

10
List<Type> list = new List<Type>(); 
foreach (Assembly ass in AppDomain.CurrentDomain.GetAssemblies()) 
{ 
    foreach (Type t in ass.GetExportedTypes()) 
    { 
     if (t.IsEnum) 
     { 
      list.Add(t); 
     } 
    } 
} 

Questo dovrebbe fare, per tutti gli assembly caricati dalla corrente AppDomain, per arrivare proprio da insiemi di cui, basta regolare ;-)

+1

Parte divertente (foneticamente): "solo regolare" :) –

3

Dando per scontato che hai l'elenco dei Assembly oggetti che si desidera controllare:

IEnumerable<Assembly> assemblies; // assign the assemblies you want to check here 

foreach (Assembly a in assemblies) { 
    foreach (Type t in assembly.GetTypes()) { 
     if (t.IsEnum) { 
      // found an enum! Do whatever... 
     } 
    } 
} 
2

si dovrebbe essere in grado di utilizzare Assembly.GetTypes() per ottenere tutti i tipi per il montaggio. Per ogni tipo, puoi usare la proprietà Type.IsEnum per vedere se è un enum.

3

È inoltre possibile utilizzare LINQ per restituire un elenco di tutti i tipi enum da un elenco di assiemi.

IEnumerable<Assembly> assemblies; 
// give assemblies some value 
var enums = from assembly in assemblies let types = assembly.GetTypes() from type in types where type.IsEnum select type; 

enums sarà di tipo IEnumerable.

2

Ecco una soluzione più funzionale:

AppDomain.CurrentDomain.GetAssemblies() 
    .SelectMany(a => a.GetTypes()) 
    .Where(t => t.IsEnum)