2009-12-02 7 views
8

Ich muss programmgesteuert einen List aller Klassen in einem bestimmten Namespace abrufen. Wie kann ich dies (Reflexion?) In C# erreichen?Get Liste der Klassen in Namespace in C#

+0

Wie ärgerlich, wenn eine Frage als Duplikat markiert wird und das Original nicht referenziert wird. – War

Antwort

24
var theList = Assembly.GetExecutingAssembly().GetTypes() 
         .Where(t => t.Namespace == "your.name.space") 
         .ToList(); 
+0

Es gibt immer die "Einzeiler". ;-) –

+1

Yeah, du musst einen One-Liner lieben :-) –

+2

Das setzt voraus, dass der ganze Namespace in der aktuellen Assembly ist, eine Teillösung bestenfalls. – War

6

Ohne LINQ:

Versuchen:

Type[] types = Assembly.GetExecutingAssembly().GetTypes(); 
List<Type> myTypes = new List<Type>(); 
foreach (Type t in types) 
{ 
    if (t.Namespace=="My.Fancy.Namespace") 
    myTypes.Add(t); 
} 
+0

Assembly.GetExecutingAssembly(). GetTypes(). ToList() gibt Ihnen die gewünschte Liste. – Gregory

+0

Ja Greg, technisch gesehen, das eine LINQ-Erweiterung-Methode verwendet und mein Beispiel sollte dies zeigen ohne .NET 3.5 –

+0

clean nicht linq Beispiel obwohl OP sagt nicht, dass die Assembly bereits geladen wurde, so dass der Code möglicherweise zurück ein leerer Satz, obwohl die Liste lang sein sollte und ein Namensraum in mehr Assemblies sein könnte. –

1

zurückzukehren Liste ändern kann ich Denken Sie nur an das Durchschleifen von Typen in einer Baugruppe, um die im richtigen Namensraum zu finden.

public List<Type> GetList() 
     { 
      List<Type> types = new List<Type>(); 
      var assembly = Assembly.GetExecutingAssembly(); 
      foreach (var type in assembly .GetTypes()) 
      { 
       if (type.Namespace == "Namespace") 
       { 
        types.Add(type); 
       } 
      } 
      return types; 
     }