2009-07-24 11 views
22

Digamos que tengo un Type llamado type.Determine si un tipo es estático

quiero para determinar si puedo hacer esto con mi tipo (sin tener que hacer esto para cada tipo):

Si type es System.Windows.Point entonces yo podría hacer esto:

Point point1 = new Point(); 

Sin embargo, si type se System.Environment entonces esto no va a volar:

Environment environment1 = new Environment(); //wrong 

Así que si estoy iteración a través de todas las tipo visible en un ensamble, ¿cómo salteo todos los tipos que no podrán crear una instancia como la segunda? Soy algo nuevo en la reflexión, así que todavía no soy tan bueno con la terminología. Espero que lo que trato de hacer aquí sea bastante claro.

Respuesta

53

static las clases se declaran abstract y sealed en el nivel IL. Por lo tanto, puede verificar la propiedad IsAbstract para manejar las clases abstract y static de una sola vez (para su caso de uso).

Sin embargo, las clases abstract no son los únicos tipos que no puede crear instancias directamente. Debería comprobar cosas como las interfaces (without the CoClass attribute) y los tipos que no tienen un constructor accesible mediante el código de llamada.

+3

Gracias por la respuesta, me hubiera llevado mucho tiempo idear esto por mi cuenta. – Beaker

-3

Esta es una forma de obtener todos los tipos de contstutores públicos de todo tipo en un conjunto.

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

puede buscar contructors públicos de este tipo,

O si sólo está interesado en constructor sin parámetros que puede utilizar

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

Tenga en cuenta que una clase 'abstracta' puede tener un constructor' public'. No puede necesariamente crear una instancia de una clase en el cuerpo de su declaración 'if'. Obtendrás 'MemberAccessException'. –

+0

sí, tienes razón, edité la publicación. –

10
type.IsAbstract && type.IsSealed 

Esto sería un cheque suficientes para C# ya que una clase abstracta no puede ser sellada o estática en C#. Sin embargo, deberá tener cuidado cuando trabaje con tipos CLR de otros idiomas.

1
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)); 

Supongo que esto debería funcionar.

Cuestiones relacionadas