2008-11-24 18 views
14

¿Cómo puedo usar el reflejo para crear una Lista genérica con una clase personalizada (Lista <CustomClass>)? Necesito poder agregar valores y usar propertyInfo.SetValue(..., ..., ...) para almacenarlo. ¿Sería mejor que almacenara estos List <> como alguna otra estructura de datos?Uso de Reflection para establecer una Propiedad con un tipo de Lista <CustomClass>

Editar:

debería haber especificado que el objeto es de la misma familia, pero la respuesta de Marc Gravell funciona todavía.

class Foo 
{ 
    public List<string> Bar { get; set; } 
} 
+0

¿Es la cadena realmente una clase personalizada? Esperaba que estuvieras hablando de algo como usar la reflexión para invocar una clase MyClass que tiene una propiedad que es una lista donde SomeOtherClass es una clase que hice que tiene un montón de propiedades y constructores, etc ... – topwik

+0

Ok , por lo que el hilo fue una mala elección para una clase, pero fue suficiente como una explicación. Se puede reemplazar la cadena con casi cualquier clase en lo que respecta a mi conocimiento limitado, pero en el caso que estaba pidiendo, la clase y el tipo en la lista se encuentran solo por reflexión. – dragonjujo

Respuesta

19
class Foo 
{ 
    public string Bar { get; set; } 
} 
class Program 
{ 
    static void Main() 
    { 
     Type type = typeof(Foo); // possibly from a string 
     IList list = (IList) Activator.CreateInstance(
      typeof(List<>).MakeGenericType(type)); 

     object obj = Activator.CreateInstance(type); 
     type.GetProperty("Bar").SetValue(obj, "abc", null); 
     list.Add(obj); 
    } 
} 
+0

que pasa si tengo clase Foo { public List bars {get; establecer;} } clase Bar { byte público Id {get; conjunto; } byte público Estado {get; conjunto; } byte público Tipo {get; conjunto; } public Bar() {} } I instanciate foo usando reflection, activator.createinstance(). Ahora necesito completar esa lista de barras con objetos Bar. – topwik

+0

¿debería compilar el código que tiene allí? Me han dicho que todavía necesito proporcionar la declaración del IList con un tipo ... IList o algo así, ¿no lo sé? – topwik

+0

Puedo hacer var list = Activator.CreateInstance (typeof (List <>). MakeGenericType (GetListType (p.ParameterType))); Pero parece que no recibo una lista, ya que la lista no parece tener un método Add ... – topwik

1

He aquí un ejemplo de tomar la Lista < > tipo y convirtiéndolo en Lista <cadena>.

var list = typeof (Lista < >) .MakeGenericType (typeof (cadena));

+0

Eso no le da una lista de ningún tipo - le da un Tipo –

Cuestiones relacionadas