Utilizzo delle proprietà di lettura della riflessione di un oggetto contenente array di un altro oggetto

StackOverflow https://stackoverflow.com/questions/4879197

Domanda

Come posso leggere le proprietà di un oggetto che contiene un elemento di tipo array usando il riflesso in C#. Se ho un metodo chiamato getmyProperties e determinerò 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 è tipo personalizzato o meno.

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 è che ho un oggetto di Arrayclass e Arrayclass ha due proprietà:

-string Id
-DeptArray[] depts

Deptaray è un'altra classe con 2 proprietà:

-string code 
-string value

Quindi, questo metodo ottiene un oggetto di Arrayclass. Voglio leggere tutte le proprietà da top-to-bottom e archiviare la coppia di nome/valore in un dizionario/elenco elenco. Sono in grado di farlo per valore, personalizzato, tipo enum. Mi sono bloccato con una serie di oggetti. Non sono sicuro di come farlo.

È stato utile?

Soluzione

Prova 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 testato questo codice e risolve correttamente le matrici attraverso la riflessione.

Altri suggerimenti

Dovrai recuperare l'oggetto del valore della proprietà e quindi chiamare getType () su di esso. Allora puoi fare qualcosa del genere:

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 - Ho estratto questo codice da un metodo di formattazione degli oggetti ricorsivi (avrei usato la serializzazione JSON per questo ora).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top