37 votes

Déterminer si un type est statique

Disons que j'ai un Type appelé type .

Je veux déterminer si je peux faire cela avec mon type (sans le faire réellement à chaque type) :

Si type es System.Windows.Point alors je pourrais faire ça :

Point point1 = new Point();

Toutefois, si type es System.Environment alors cela ne marchera pas :

Environment environment1 = new Environment(); //wrong

Donc, si j'itère à travers tous les types visibles d'un assemblage, comment puis-je sauter tous les types qui ne créeront pas d'instance comme le deuxième ? Je suis un peu nouveau dans le domaine de la réflexion, donc je ne suis pas encore très au fait de la terminologie. J'espère que ce que j'essaie de faire ici est assez clair.

86voto

Mehrdad Afshari Points 204872

static les classes sont déclarées abstract y sealed au niveau de la VA. Ainsi, vous pouvez vérifier IsAbstract pour gérer les deux abstract et static en une seule fois (pour votre cas d'utilisation).

Cependant, abstract ne sont pas les seuls types que vous ne pouvez pas instancier directement. Vous devez vérifier des choses comme les interfaces ( sans le CoClass attribut ) et les types qui n'ont pas de constructeur accessible par le code appelant.

23voto

Joe Chung Points 6263
type.IsAbstract && type.IsSealed

Ce serait une vérification suffisante pour C# puisqu'une classe abstraite ne peut pas être scellée ou statique en C#. Cependant, vous devrez être prudent lorsque vous traiterez des types CLR d'autres langues.

7voto

ArsenMkrt Points 24447

Vous pouvez rechercher les constructeurs publics comme ceci,

Type t = typeof(Environment);
var c = t.GetConstructors(BindingFlags.Public);
if (!t.IsAbstract && c.Length > 0)
{
     //You can create instance
}

Ou si vous n'êtes intéressé que par un constructeur sans paramètre, vous pouvez utiliser

Type t = typeof(Environment);
var c = t.GetConstructor(Type.EmptyTypes);
if (c != null && c.IsPublic && !t.IsAbstract )
{
     //You can create instance
}

1voto

shahkalpesh Points 21553
Type t = typeof(System.GC);
Console.WriteLine(t.Attributes);
TypeAttributes attribForStaticClass = TypeAttributes.AutoLayout | TypeAttributes.AnsiClass | TypeAttributes.Class |
TypeAttributes.Public | TypeAttributes.Abstract | TypeAttributes.Sealed | TypeAttributes.BeforeFieldInit;
Console.WriteLine((t.Attributes == attribForStaticClass));

Je suppose que ça devrait marcher.

-4voto

pb. Points 4609

C'est une façon d'obtenir tous les contstucteurs publics de tous les types dans un assemblage.

    var assembly = AppDomain.CurrentDomain.GetAssemblies()[0]; // first assembly for demo purposes
var types = assembly.GetTypes();
foreach (var type in types)
{
    var constructors = type.GetConstructors();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X