2011-02-02 11 views
11

Come leggere le proprietà di un oggetto che contiene un elemento del tipo di matrice utilizzando la riflessione in C#. Se ho un metodo chiamato GetMyProperties e determino che l'oggetto è un tipo personalizzato, come posso leggere le proprietà di un array e i valori all'interno. IsCustomType è un metodo per determinare se il tipo è di tipo personalizzato o meno.Utilizzo delle proprietà di lettura riflessa di un oggetto contenente una matrice di un altro oggetto

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); 
     } 
    } 
} 

Lo scenario è, io ho un oggetto di ArrayClass e ArrayClass ha due proprietà:

-string Id 
-DeptArray[] depts 

DeptArray è un'altra classe con 2 proprietà:

-string code 
-string value 

Quindi, questo metodo ottiene un oggetto di ArrayClass. Voglio leggere tutte le proprietà da cima a fondo e memorizzare coppia nome/valore in un dizionario/voce di elenco. Sono in grado di farlo per valore, personalizzato, tipo enum. Sono rimasto bloccato con una serie di oggetti. Non sei sicuro di come farlo.

+0

Ciao, non vedo dal tuo codice quello che stai cercando di ottenere. Il codice non verrà compilato, perché pInfo.GetValue restituisce un oggetto, non una stringa. – Adam

+0

Ci scusiamo per questo. Ho modificato il codice per aggiungere ToString() a pInfo.GetValue(). Ho dovuto fare questo metodo. In origine il metodo ha una logica complessa. Per semplificare, ho bisogno di leggere tutte le proprietà, proprietà della proprietà e il loro valore. –

risposta

15

provare questo codice:

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()); 
     } 
     } 
    } 
    } 
} 

Ho provato questo codice e si risolve array attraverso la riflessione in modo corretto.

+0

@evgk, non riesco a trasmettere esplicitamente a DeptArray. Determore il tipo in fase di esecuzione. Il parametro metodo "obj" può avere qualsiasi oggetto di classe. Ho bisogno di un metodo generico per verificare la presenza di array e iterare attraverso il suo elemento. –

+0

Oppure, non ci sono problemi, ho modificato la risposta. Ora otterrà tutti gli array nell'oggetto passato e itererà attraverso ogni elemento dell'array e le sue proprietà senza eseguire esplicitamente il casting. Puoi anche rendere questo metodo ricorsivo se lo desideri. – EvgK

+0

@Evgk, geniale! questo è perfetto - Grazie, testerò la logica con diverse proprietà dell'oggetto per vedere se fallisce da qualche parte. Quando dici ricorsivo, controlla se le proprietà di un array hanno una matrice all'interno? –

0

È necessario recuperare l'oggetto valore di proprietà e quindi chiamare GetType() su di esso. Poi si può fare qualcosa di simile:

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(); 
    } 
} 

CRONACA - ho tirato questo codice da un metodo di formattazione oggetto ricorsivo (vorrei usare JSON serializzazione per ora).

+0

No, intendo GetGetMethod. Perché chiameresti GetSetMethod? Non stai cercando di leggere la proprietà e se è una matrice di DeptArray iterare sugli elementi e leggerli? – JohnOpincar

+0

Sto cercando di rispondere a questa domanda "Come posso leggere le proprietà di un oggetto che contiene un elemento di tipo array usando il reflection in C#." Se questa non è la domanda, dovresti modificarla. – JohnOpincar

+0

John, hai assolutamente ragione che ho bisogno di leggere la proprietà e iterare su DeptArray. Quando eseguo questo pezzo di codice. Ottengo un errore di trasmissione su Array a = (Array) obj. Dice che ARrayClass può essere castato su Array. Pensi che mi sia sfuggito qualcosa da dire? –

Problemi correlati