2010-01-04 11 views
8

Quiero crear una instancia de los tipos de valor como System.String, System.Boolean, System.Int32, etc. consigo nombres calificados de tipos como System.String oMyNamespace.Employee y tengo que crear una instancia y regreso. Yo uso Activator.CreateInstance y FormatterServices.GetUninitializedObject para crear instancias. Pero falla en el caso de los tipos de valores. No puedo codificar la lógica en caso de tipos de valores. Necesito una forma genérica de crear instancias de ambos tipos de valores y tipos de referencia.Cómo crear una instancia de tipos de valores que utilizan la reflexión

+3

System.String es un tipo de referencia, no un tipo de valor. –

Respuesta

11

¿Qué es exactamente lo que estás tratando de hacer? FormatterServices.GetUninitializedObject se usa principalmente por código de serialización; fuera de eso, realmente no deberías usarlo. Se suena como que sólo podría necesitar algo así como TypeConverter, es decir, (para este tipo)

TypeConverter tc = TypeDescriptor.GetConverter(someType); 
object obj = tc.ConvertFromString(s); 
+0

Gracias ayudó. –

+0

Oh, encantador para cosas genéricas :) – Nyerguds

3

¿Qué es exactamente está fallando? He probado el siguiente código para ver si hay un problema con los tipos de valor:

var instance = Activator.CreateInstance(typeof(Int32)); 

Me da una instancia Int32 puesto a 0.

exactamente dónde está fallando el código? De lo contrario, diría que el problema radica en la forma en que está cargando el tipo, no en la forma en que está creando la instancia.

+0

Eish Jaco! Acabo de regresar para cambiar mi 'var' por 'int', en caso de que 'var' no fuera familiar para el OP, y sigues la misma línea de código que yo. :-) – ProfK

+0

Jaja - tienes que ser rápido en el sorteo :-) –

0

Esto funciona para mí:

int x = (int)Activator.CreateInstance(typeof (Int32), true); 
1

Por tipos de valor BCL (y cuando el uso de cadenas para describir tipos) asegurarse de que no está utilizando C# palabras clave y asegurar el tipo está plenamente cualificado con espacio de nombres. Por ejemplo, C# int se ha creado correctamente esta manera con Activator.CreateInstance (..)

object num = Activator.CreateInstance(Type.GetType("System.Int32")); 

Usted recibirá intentos fallidos si intenta utilizar alias específicos del lenguaje como "int" o cortas formas como "Int32".

Cuestiones relacionadas