2010-04-14 6 views
6

beaucoup de questions sont proches, mais ne répond mon problème ...Utiliser la réflexion pour obtenir une liste des classes statiques

Comment puis-je utiliser la réflexion en C# 3.5 pour obtenir toutes les classes qui sont statiques d'un assemblage. J'ai déjà tous les types définis, mais il n'y a pas de propriété IsStatic. Compter 0 constructeurs est vraiment lent et ne fonctionne pas non plus.

Des astuces ou une ligne de code? :-)

Chris

Répondre

12

Voici comment vous obtenez les types d'un assemblage:

http://msdn.microsoft.com/en-us/library/system.reflection.assembly.aspx

GetTypes Method

Puis:

Rechercher les classes abstraites et scellés en même temps.

http://dotneteers.net/blogs/divedeeper/archive/2008/08/04/QueryingStaticClasses.aspx

Recherche dans les blogs que je pourrais trouver les informations que .NET CLR ne connaît pas l'idée de classes statiques, mais permet d'utiliser les indicateurs de type abstrait et scellés en même temps. Ces indicateurs sont également utilisés par le CLR pour optimiser son comportement, par exemple l'indicateur scellé est utilisé pour appeler des méthodes virtuelles de classe scellée comme les non-virtuelles. Donc, pour demander si un type est statique ou non, vous pouvez utiliser cette méthode:

Depuis le commentaire ci-dessous:

IEnumerable<Type> types = typeof(Foo).Assembly.GetTypes().Where 
(t => t.IsClass && t.IsSealed && t.IsAbstract); 
+1

Alors, étant donné la réponse de Kevin, vous pouvez obtenir les classes comme ceci: 'IEnumerable types = typeof (Foo) .Assembly.GetTypes() .Where (t => t.IsClass && t.IsSealed && t.IsAbstract); ' –

1

classes statiques sont une caractéristique de C#, pas la spécification de langage commun, et donc il n'y a pas un morceau de métadonnées sur une instance de type qui indiquerait qu'il est une classe statique. Cependant, vous pouvez vérifier s'il s'agit d'un type scellé et si tous ses membres non hérités sont statiques.

3

Qu'est-ce que C# appelle une classe statique, est une classe abstraite, scellée au CLR. Donc, vous devez regarder IsAbstract & & IsSealed.

1

Vous devez combiner les vérifications suivantes: Abstract, Sealed, BeforeFieldInit. Après la classe statique vous pouvez voir compile le code IL suivant dans l'assembly compilé:

.class public abstract auto ansi sealed beforefieldinit StaticClass 
    extends [mscorlib]System.Object 
{ 
} 
Questions connexes