2009-06-04 7 views
58

Comment puis-je obtenir toutes les classes dans un espace de noms en C#?Comment puis-je obtenir toutes les classes dans un espace de noms?

+1

duplication possible de [Saisie de toutes les classes d'un nom spécifique space] (http://stackoverflow.com/questions/343869/taking-out-all-classes-of-a-specific-namespace) – nawfal

+1

Copie possible de [Obtenir tous les types dans un espace de nom par réflexion] (https: // stackoverflow.com/questions/79693/getting-all-types-in-a-namespace-via-reflection) – Liam

Répondre

108

Vous devrez le faire "en arrière"; liste de tous les types dans un assemblage, puis contrôle l'espace de noms de chaque type:

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

Exemple d'utilisation:

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

Pour tout avant .Net 2.0 où Assembly.GetExecutingAssembly() n'est pas disponible, vous aura besoin d'une petite solution de contournement pour obtenir l'assemblage:

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

attention que Assembly! = namespace - certains espaces de noms sont répartis sur plusieurs assemblys. – Bevan

+1

et pourquoi ne pas retourner juste un IEnumerable ? D'autant plus, vous faites une énumération entre les résultats, aussi 'foreach' au lieu de 'for' est meilleur, je pense. – abatishchev

0

Avec Reflection vous pouvez parcourir tous les types d'un assemblage. Un type a une propriété Namespace que vous utilisez pour filtrer uniquement l'espace de nom qui vous intéresse.

5

Vous devrez fournir un peu plus d'informations ...

Voulez-vous dire en utilisant la réflexion. Vous pouvez itérer un des ensembles Manifest et obtenir une liste des types en utilisant

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

    myAssembly.ManifestModule.FindTypes() 

Si c'est juste dans Visual Studio, vous pouvez simplement obtenir la liste dans la fenêtre IntelliSense, ou en ouvrant l'Explorateur d'objets (CTRL + W , J)

Questions connexes