2009-06-04 14 views
58

Jak mogę uzyskać wszystkie klasy w przestrzeni nazw w C#?Jak mogę uzyskać wszystkie klasy w przestrzeni nazw?

+1

możliwy duplikat [Wydobywa wszystkie klasy o określonej nazwie space] (http://stackoverflow.com/questions/343869/taking-out-all-classes-of-a-specific-namespace) – nawfal

+1

Możliwy duplikat [Pobieranie wszystkich typów w przestrzeni nazw za pomocą refleksji] (https: // stackoverflow.com/questions/79693/getting-all-types-in-a-namespace-via- reflection) – Liam

Odpowiedz

108

Będziesz musiał to zrobić "wstecz"; listy wszystkich typów w zespole, a następnie sprawdzanie nazw każdego typu:

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

Przykład użycia:

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

Do niczego przed .NET 2.0 gdzie Assembly.GetExecutingAssembly() nie jest dostępny, będzie wymagać niewielkiego obejścia, aby zmontować:

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

Trzymaj pamiętaj, że Assembly! = namespace - niektóre przestrzenie nazw są rozmieszczone na wielu złożeniach. – Bevan

+1

i dlaczego nie zwrócić tylko IEnumerable ? Tym bardziej, że robisz wyliczenie między wynikami, również "foreach" zamiast "for" jest lepszy, jak sądzę. – abatishchev

0

Przy odbiciu pętla przechodzi przez wszystkie typy w zespole. Typ ma właściwość Namesepace którego używasz do filtrowania tylko nazw, które Cię interesują.

5

Musisz dostarczyć trochę więcej informacji ...

Czy to znaczy za pomocą refleksji. Można iterację an zespołów Oczywista i uzyskać listę typów używając

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

    myAssembly.ManifestModule.FindTypes() 

Jeśli to tylko w Visual Studio, można po prostu listę w oknie intellisense lub otwierając przeglądarkę Object (CTRL + W , J)

Powiązane problemy