2011-06-03 9 views
5

Tengo un requisito donde el tipo de objeto [nombre del objeto] se pasa como una variable de cadena. Ahora, basándome en el nombre del objeto pasado, necesito crear ese tipo de objeto. Tenga en cuenta que el valor de la cadena contiene el nombre exacto del tipo de objeto. He escrito un fragmento de código pero arroja una excepción.Convierta un objeto en un tipo basado en el valor de cadena pasado en C#

por ejemplo -

string objectName = "EntityTest.Entity.OrderEntity";//Entity type name 
object obj = new object(); 
object newobj = new object(); 
newobj = Convert.ChangeType(obj, Type.GetType(objectName)); 

hago esto me sale error ->Object must implement IConvertible.

Mi entidad OrderEntity ya ha implementado la interfaz IConvertible.

Cualquier ayuda/sugerencia es muy apreciada. ¿Hay alguna otra forma en que pueda crear el objeto para cumplir con mi requisito?

Respuesta

3

Su problema es que está creando una instancia de object y luego intenta convertir eso a un tipo más específico (que no puede ser).

Necesita una forma de llamar al constructor predeterminado del tipo que está intentando crear. Echar un vistazo a Activator.CreateInstance():

var type = Type.GetType(typeName); 
var instance = Activator.CreateInstance(type); 

Si el tipo no tiene constructor por defecto, el ejemplo anterior se producirá un error. En ese caso, lo mejor es, probablemente, a use this overload (que lleva una matriz de objetos para usar como parámetros de constructor y luego trata de encontrar la mejor coincidencia)

9

actualmente está tratando de convertir un objeto existente , en vez que crear uno del tipo correcto. Asumiendo que su llamada Type.GetType está trabajando, sólo puede utilizar:

Type type = Type.GetType(objectName); 
object x = Activator.CreateInstance(type); 

Algunos puntos a tener en cuenta:

  • Type.GetType(string) requiere un nombre de montaje cualificado menos el tipo es ya sea en el momento de aplicación inmediata ensamblaje o mscorlib
  • Activator.CreateInstance(Type) llamará al constructor sin parámetros (que debe ser accesible); si necesita pasar argumentos al constructor, hay other overloads disponibles.
+0

esto es genial, pero ¿cómo podemos pasar el valor al nuevo objeto generado? –

+0

@HamedZakeryMiab: ¿Quiere decir que quiere llamar a un constructor parametrizado? Puede llamar a 'type.GetConstructors()', encontrar el constructor correcto e invocarlo, o usar una de las sobrecargas para 'Activator.CreateInstance' que le permite especificar argumentos. Pruébalos y si tienes problemas, comienza una nueva pregunta. –

Cuestiones relacionadas