2009-06-04 9 views
58

Come posso ottenere tutte le classi all'interno di un namespace in C#?Come posso ottenere tutte le classi in uno spazio dei nomi?

+1

possibile duplicato di [Estrarre tutte le classi di un nome specifico spazio] (http://stackoverflow.com/questions/343869/taking-out-all-all-classes-of-a-specific-namespace) – nawfal

+1

Possibile duplicato di [Ottenere tutti i tipi in un namespace tramite riflessione] (https: // stackoverflow.com/questions/79693/getting-all-types-in-a-namespace-via-reflection) – Liam

risposta

108

Sarà necessario farlo "all'indietro"; elencare tutti i tipi in un assieme e poi controllando lo spazio dei nomi di ogni tipo:

using System.Reflection; 
private Type[] GetTypesInNamespace(Assembly assembly, string nameSpace) 
{ 
    return 
     assembly.GetTypes() 
       .Where(t => String.Equals(t.Namespace, nameSpace, StringComparison.Ordinal)) 
       .ToArray(); 
} 

Esempio di utilizzo:

Type[] typelist = GetTypesInNamespace(Assembly.GetExecutingAssembly(), "MyNamespace"); 
for (int i = 0; i < typelist.Length; i++) 
{ 
    Console.WriteLine(typelist[i].Name); 
} 

Per nulla prima Net 2.0 dove Assembly.GetExecutingAssembly() non è disponibile, è sarà necessario un piccolo rimedio per ottenere l'assemblea:

Assembly myAssembly = typeof(<Namespace>.<someClass>).GetTypeInfo().Assembly; 
Type[] typelist = GetTypesInNamespace(myAssembly, "<Namespace>"); 
for (int i = 0; i < typelist.Length; i++) 
{ 
    Console.WriteLine(typelist[i].Name); 
} 
+2

.Where (t => String.Equals (t.Namespace, nameSpace, StringComparison.Ordinal) – abatishchev

+6

Inoltre, mantieni attenzione all'assemblaggio! = spazio dei nomi: alcuni spazi dei nomi sono distribuiti su più assiemi. – Bevan

+1

e perché non restituire solo un IEnumerable ? Tanto più, fai un enumerazione tra i risultati, anche "foreach" invece di "for" è meglio, credo. – abatishchev

0

Con Reflection si esegue il ciclo di tutti i tipi in un assieme. Un tipo ha una proprietà Namespace che si usa per filtrare solo lo spazio dei nomi che ti interessa.

5

Avrete bisogno di fornire un po 'più di informazioni ...

cosa si intende per utilizzando Reflection. È possibile scorrere un'assemblee Manifest e ottenere un elenco dei tipi di utilizzo

System.Reflection.Assembly myAssembly = Assembly.LoadFile(""); 

    myAssembly.ManifestModule.FindTypes() 

Se è solo in Visual Studio, si può solo ottenere l'elenco nella finestra di IntelliSense, o aprendo il Visualizzatore oggetti (CTRL + W , J)

Problemi correlati