Utilizzo delle proprietà di lettura della riflessione di un oggetto contenente array di un altro oggetto
-
28-10-2019 - |
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.
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).