2009-06-04 4 views
58

Wie kann ich alle Klassen innerhalb eines Namensraums in C# bekommen?Wie kann ich alle Klassen innerhalb eines Namensraums erhalten?

+1

möglich duplicate of [Herausnehmen aller Klassen eines bestimmten Namens Leerzeichen] (http://stackoverflow.com/questions/343869/taking-out-all-classes-of-a-specific-namespace) – nawfal

+1

Mögliches Duplikat von [Alle Typen in einem Namespace durch Reflektion abrufen] (https: // stackoverflow.com/questions/79693/getting-all-types-in-a-namespace-via-reflection) – Liam

Antwort

108

Sie müssen es "rückwärts" tun; Liste alle Typen in einer Assembly und dann den Namensraum für jeden Typ Überprüfung:

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

Anwendungsbeispiel:

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

Für alles, was vor dem .Net 2.0, wo Assembly.GetExecutingAssembly() nicht verfügbar ist, können Sie benötigt eine kleine Problemumgehung, um die Assembly zu erhalten:

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

Halten Sie auch in Beachten Sie, dass Assembly! = Namespace - einige Namespaces sind auf mehrere Assemblys verteilt. – Bevan

+1

und warum nicht nur ein IEnumerable zurückgeben? Umso mehr, Sie machen eine Aufzählung zwischen den Ergebnissen, auch "foreach" statt "for" ist besser, denke ich. – abatishchev

0

Mit Reflection durchlaufen Sie alle Typen in einer Baugruppe. Ein Typ hat eine Namespace-Eigenschaft, die Sie nur den Namespace-Filter verwenden, um die Sie sich interessieren.

5

Sie werden ein wenig mehr Informationen zur Verfügung stellen müssen ...

Sie mithilfe Reflexion bedeuten Sie. Sie können eine Baugruppen durchlaufen Manifest und eine Liste der Arten erhalten mit

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

    myAssembly.ManifestModule.FindTypes() 

Wenn es nur in Visual Studio, können Sie sich nur die Liste im IntelliSense-Fenster oder durch den Objektkatalog (CTRL + W öffnen , J)