2012-08-14 15 views
16

Tengo un problema. Quiero crear una instancia de clase por nombre. Encontré Activator.CreateInstancehttp://msdn.microsoft.com/en-us/library/d133hta4.aspx y funciona bien, y encontré esto: Setting a property by reflection with a string value también.C# creando una instancia de clase y estableciendo propiedades por nombre en la cadena

¿Pero cómo hacer ambas cosas? Quiero decir, sé el nombre de la clase, sé todas las propiedades de esa clase y tengo esto en cadena. Por ejemplo:

string name = "MyClass"; 
string property = "PropertyInMyClass"; 

Cómo crear la instancia y establezca algún valor a las propiedades?

+1

Usted casi no puede hacer tal cosa. La creación de objetos y la configuración de las propiedades son cosas completamente separadas desde el punto de vista de Reflexión. Además, deberá configurar cada propiedad por separado. Por supuesto, puede crear una función de ayuda que tomará su cadena empaquetada, la dividirá en partes, analizará y luego creará el objeto y establecerá las proezas. Creo que debería hacer el truco para ti. – quetzalcoatl

Respuesta

44

Se podría utilizar la reflexión:

using System; 
using System.Reflection; 

public class Foo 
{ 
    public string Bar { get; set; } 
} 

public class Program 
{ 
    static void Main() 
    { 
     string name = "Foo"; 
     string property = "Bar"; 
     string value = "Baz"; 

     // Get the type contained in the name string 
     Type type = Type.GetType(name, true); 

     // create an instance of that type 
     object instance = Activator.CreateInstance(type); 

     // Get a property on the type that is stored in the 
     // property string 
     PropertyInfo prop = type.GetProperty(property); 

     // Set the value of the given property on the given instance 
     prop.SetValue(instance, value, null); 

     // at this stage instance.Bar will equal to the value 
     Console.WriteLine(((Foo)instance).Bar); 
    } 
} 
+1

@Darin, probé el mismo código y devuelve el error como "No se pudo cargar el tipo 'Foo' del ensamblado 'GenerateClassDynamically_ConsoleApp1, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null'." . El tipo de excepción es "Excepción System.TypeLoad". No entiendo por qué está apareciendo? –

+0

@Darin, probé el mismo código y devuelve el error como "No se pudo cargar el tipo 'Foo' del ensamblado 'GenerateClassDynamically_ConsoleApp1, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null'." . El tipo de excepción es "Excepción System.TypeLoad". No entiendo por qué está apareciendo? Por favor, ayúdame. Tengo el mismo requisito que obtiene un servicio de SAP y necesito generar clases y agregar propiedades a esa clase de forma dinámica y enviarlas de vuelta al servicio para obtener los datos de respuesta. –

1

Si tuviera System.TypeLoad excepción, su nombre de la clase que está mal.

Al método Type.GetType debe ingresar nombre calificado para montaje. Ese es el nombre del proyecto, por ejemplo: GenerateClassDynamically_ConsoleApp1.Foo

Si es en otro Jou todo deberá introducir nombre de ensamblado después de la coma (detalles en la https://stackoverflow.com/a/3512351/1540350): Type.GetType ("GenerateClassDynamically_ConsoleApp1.Foo, GenerateClassDynamically_ConsoleApp1 ");

-3
Type tp = Type.GetType(Namespace.class + "," + n.Attributes["ProductName"].Value + ",Version=" + n.Attributes["ProductVersion"].Value + ", Culture=neutral, PublicKeyToken=null"); 
if (tp != null) 
{ 
    object o = Activator.CreateInstance(tp); 
    Control x = (Control)o; 
    panel1.Controls.Add(x); 
} 
Cuestiones relacionadas