2011-02-02 17 views
11

¿Cómo puedo leer las propiedades de un objeto que contiene un elemento del tipo de matriz utilizando la reflexión en C#. Si tengo un método llamado GetMyProperties y determino que el objeto es un tipo personalizado, entonces, ¿cómo puedo leer las propiedades de una matriz y los valores que contiene? IsCustomType es un método para determinar si el tipo es personalizado o no.Uso de las propiedades de lectura de reflexión de un objeto que contiene una matriz de otro objeto

public void GetMyProperties(object obj) 
{ 
    foreach (PropertyInfo pinfo in obj.GetType().GetProperties()) 
    { 
     if (!Helper.IsCustomType(pinfo.PropertyType)) 
     { 
      string s = pinfo.GetValue(obj, null).ToString(); 
      propArray.Add(s); 
     } 
     else 
     { 
      object o = pinfo.GetValue(obj, null); 
      GetMyProperties(o); 
     } 
    } 
} 

El escenario es, tengo un objeto de ArrayClass y ArrayClass tiene dos propiedades:

-string Id 
-DeptArray[] depts 

DeptArray es otra clase con 2 propiedades:

-string code 
-string value 

Por lo tanto, estos métodos obtiene un objeto de ArrayClass. Quiero leer todas las propiedades de arriba a abajo y almacenar el par nombre/valor en un elemento de diccionario/lista. Puedo hacerlo por valor, personalizado, tipo enum. Me quedé atrapado con una gran variedad de objetos. No estas seguro de cómo hacerlo.

+0

Hola, no veo en tu código lo que intentas lograr. El código no se compilará, porque pInfo.GetValue devuelve un objeto, no una cadena. – Adam

+0

Lo siento. He editado el código para agregar ToString() a pInfo.GetValue(). Tenía que inventar este método. Originalmente, el método tiene una lógica compleja. Para simplificar, necesito leer todas las propiedades, la propiedad de la propiedad y su valor. –

Respuesta

15

probar este código:

public static void GetMyProperties(object obj) 
{ 
    foreach (PropertyInfo pinfo in obj.GetType().GetProperties()) 
    { 
    var getMethod = pinfo.GetGetMethod(); 
    if (getMethod.ReturnType.IsArray) 
    { 
     var arrayObject = getMethod.Invoke(obj, null); 
     foreach (object element in (Array) arrayObject) 
     { 
     foreach (PropertyInfo arrayObjPinfo in element.GetType().GetProperties()) 
     { 
      Console.WriteLine(arrayObjPinfo.Name + ":" + arrayObjPinfo.GetGetMethod().Invoke(element, null).ToString()); 
     } 
     } 
    } 
    } 
} 

He probado este código y se resuelve mediante la reflexión matrices correctamente.

+0

@evgk, no puedo convertirlo explícitamente en DeptArray. Determino el tipo en tiempo de ejecución. El parámetro de método "obj" puede tener cualquier objeto de clase. Necesito un método genérico para verificar las matrices y repetir su elemento. –

+0

O, no hay problemas, he modificado la respuesta. Ahora obtendrá todas las matrices en el objeto pasado e iterará a través de cada elemento de la matriz y sus propiedades sin conversión explicita. También puede hacer este método recursivo si lo desea. – EvgK

+0

@Evgk, Brilliant! esto es perfecto - Gracias, probaré la lógica con diferentes propiedades de objeto para ver si falla en algún lugar. Cuando dices recursivo, ¿es para comprobar si las propiedades de una matriz tienen matriz dentro? –

0

Tendrá que recuperar el objeto de valor de propiedad y luego llamar a GetType() en él. A continuación, puede hacer algo como esto:

var type = pinfo.GetGetMethod().Invoke(obj, new object[0]).GetType(); 
if (type.IsArray) 
{ 
    Array a = (Array)obj; 
    foreach (object arrayVal in a) 
    { 
     // reflect on arrayVal now 
     var elementType = arrayVal.GetType(); 
    } 
} 

FYI - Saqué el código de un método recursivo formato de los objetos (me gustaría utilizar la serialización JSON de ahora).

+0

No, me refiero a GetGetMethod. ¿Por qué llamarías a GetSetMethod? ¿No estás tratando de leer la propiedad y si se trata de una matriz de DeptArray iterar sobre los elementos y leerlos? – JohnOpincar

+0

Estoy tratando de responder a esta pregunta "¿Cómo puedo leer las propiedades de un objeto que contiene un elemento del tipo de matriz mediante la reflexión en C#." Si esa no es la pregunta, entonces deberías editarla. – JohnOpincar

+0

John, tienes toda la razón en que necesito leer la propiedad e iterar sobre DeptArray. Cuando ejecuto esta pieza de código. Recibo un error de lanzamiento en Array a = (Array) obj. Dice que ARrayClass no puede ser transferido a Array. ¿Crees que me perdí algo que contar? –

Cuestiones relacionadas