2011-04-06 19 views
10

En C#, ¿cómo puedo averiguar si se puede crear una instancia de Type? Estoy tratando de evitar una excepción Activator.CreateInstance.Averiguar si el tipo es instanciable

Mi método actual es type.IsClass && !type.IsInterface, pero me preocupa que esto pueda fallar en las clases abstractas, etc. También consideré revisar type.TypeInitializer == null, pero no estoy seguro si eso es infalible tampoco.

¿Cuál es la forma más simple/más eficiente posible de averiguar si un Type es instanciable?

+4

Hay 'type.IsAbstract'. –

+1

Para que sea "seguro", no debería también tener que comprobar IsPublic y propiedades similares en el objeto ConstructorInfo devuelto por GetConstructor(). No lo sé. Estoy preguntando ... –

Respuesta

7

Hay muchas otras trampas. Podría tener un constructor privado o protegido. O puede que no tenga un constructor predeterminado, solo constructores que toman ciertos tipos de argumentos. Si tiene que preocuparse por eso, seguramente está usando Activator.CreateInstance() cuando no se debe usar. Solo construir objetos arbitrariamente solo puede crear estragos, no tienes idea de qué tipo de efectos secundarios pueden tener. Evita la clase "FormatDisk".

Una excepción es su amigo, le dice que sus suposiciones eran incorrectas. Nunca detengas intencionalmente el marco .NET para que no sea útil.

+0

Estoy creando instancias de implementaciones de una interfaz, así que sé algo sobre ellas. Aunque aprecio la advertencia. – user664939

+0

Excelente, entonces no debería tener que preocuparse por excepciones o por crear accidentalmente una clase abstracta. Un nombre simple y conocido hace el trabajo. –

+0

¿Qué debo hacer para buscar un constructor predeterminado? – user664939

Cuestiones relacionadas