Foros del Web » Programación para mayores de 30 ;) » .NET »

Instanciar clases con reflection.

Estas en el tema de Instanciar clases con reflection. en el foro de .NET en Foros del Web. Hi gurus de la programación, hoy vengo con una duda, os la expongo a continuación: Tengo una nested class, sencillita, que forma parte de otra ...
  #1 (permalink)  
Antiguo 28/11/2012, 09:10
Avatar de Nekeniehl  
Fecha de Ingreso: julio-2009
Ubicación: Berlin, Alemania / Granada, España
Mensajes: 132
Antigüedad: 14 años, 9 meses
Puntos: 6
Pregunta Instanciar clases con reflection.

Hi gurus de la programación, hoy vengo con una duda, os la expongo a continuación:

Tengo una nested class, sencillita, que forma parte de otra nested class, que forma parte de la clase principal:

Edit
Bueno por cuestiones laborales tengo que borrar las dos clases, pero se queda la función que es la que "representa" mis dudas
/Edit


Ahora tengo un método, que me rellena la clase principal dependiendo de los valores que tengo en un diccionario:

Código C#:
Ver original
  1. private void FillClass(Object inObject, Dictionary<String, String> inValues)
  2.         {
  3.             Type oType = inObject.GetType();
  4.             PropertyInfo[] infos = oType.GetProperties();
  5.  
  6.             foreach (PropertyInfo info in infos)
  7.             {
  8.                 String pName = info.Name;
  9.  
  10.                 if (info.PropertyType.Name.Contains("List"))
  11.                 {
  12.                     pName = pName.Substring(0, pName.IndexOf("List"));
  13.                     if (inValues.ContainsKey(pName.ToLower()))
  14.                     {
  15.                         if (!inValues[pName.ToLower()].Equals(""))
  16.                         {
  17.                             var convert = (IList)info.GetValue(inObject, null);
  18.  
  19.  
  20.                             Type t = convert.GetType().GetGenericArguments()[0];
  21.                             Object obj = (Object)Activator.CreateInstance(t, inValues["jahresverbrauchsprognose"]);
  22.  
  23.  
  24.                             convert.Add(obj);
  25.                         }
  26.                     }
  27.                 }
  28.                 else
  29.                     if (inValues.ContainsKey(pName.ToLower()))
  30.                     {
  31.                         info.SetValue(inObject, inValues[pName.ToLower()], null);
  32.                     }
  33.             }
  34.         }

Escenario:

-Los tipos de datos con los que trabajo en la clase principal son: String, DateTime y List<T> (T= Objecto complejo)

-Con los String no tengo problema, como veis en el "else" me pone los valores en el objeto que está instanciado antes de llamar a la función (lo paso por parametro)

-Con los DateTime tampoco hay problema porque solo están en la clase principal.

Problema:
-Las listas de objetos complejos: Como veis en las separaciones que he señalado en el segundo nivel es con la que estoy "Testeando" he intentando solucionar el problema.

La cosa es que el problema esta a medio solucionar, el objeto se crea, lo añado a la lista, y mas adelante, esa lista, la pongo en el sitio al que pertenece en el segundo nivel pero, como veis, no es genérico:

Que pasa cuando la nested class pertinente no tiene parametros en el constructor? como puedo saber si tiene parametros en el constructor sin que me lo diga una excepcion? Como puedo saber que parámetros me pide? Teneis una solución mejor que no sea hacerlo a mano clase por clase (por eso estoy usando reflection), bueno, gracias de antemano, seguiré trabajando mientras tanto a ver si encuentro una solución. Saludos
__________________
Antes de cambiar el mundo...dá tres vueltas por tu casa

Usa Google es tu amigo ;)

Última edición por Nekeniehl; 28/11/2012 a las 10:06
  #2 (permalink)  
Antiguo 28/11/2012, 21:49
Avatar de gedarufi  
Fecha de Ingreso: diciembre-2008
Ubicación: Colombia
Mensajes: 540
Antigüedad: 15 años, 4 meses
Puntos: 22
Respuesta: Instanciar clases con reflection.

Despues de que tengas el objeto Type de tu clase puedes utilizar el metodo GetConstructors() que te devuelve un Array de ConstructorInfo ahi lo que debes de hacer es llamar la propiedad Attributes que te dice cuales parametros recibe el constructor y finalmente el metodo Invoque que se encarga de instanciarte un nuevo objeto de ese tipo.


Saludos
  #3 (permalink)  
Antiguo 29/11/2012, 03:15
Avatar de Nekeniehl  
Fecha de Ingreso: julio-2009
Ubicación: Berlin, Alemania / Granada, España
Mensajes: 132
Antigüedad: 14 años, 9 meses
Puntos: 6
Respuesta: Instanciar clases con reflection.

Gracias por contestar!

Realmente el "invoke" del objecto e instanciarlo lo hago con
Código C#:
Ver original
  1. var convert = (IList)info.GetValue(inObject, null);
  2.  
  3.                             Type t = convert.GetType().GetGenericArguments()[0];
  4.  
  5.                             Object obj = (Object)Activator.CreateInstance(t, inValues[t.Name.ToLower()]);
  6.  
  7.                             convert.Add(obj);

Pero con lo que me has comentado del GetConstructor () me respondes a todas las dudas, muchas gracias por la ayuda =D
__________________
Antes de cambiar el mundo...dá tres vueltas por tu casa

Usa Google es tu amigo ;)
  #4 (permalink)  
Antiguo 29/11/2012, 08:38
Avatar de gedarufi  
Fecha de Ingreso: diciembre-2008
Ubicación: Colombia
Mensajes: 540
Antigüedad: 15 años, 4 meses
Puntos: 22
Respuesta: Instanciar clases con reflection.

Me alegro que te haya sido util



Saludos

Etiquetas: clases, instanciar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:10.