Sto tentando di creare una routine ricorsiva che recuperi PropertyInfos per tutti i membri in un oggetto specificato (in .NET 3.5). Tutto per i membri immediati funziona, ma deve anche analizzare le classi annidate (e le loro classi annidate, ecc.).Procedura ricorsiva per ottenere PropertyInfo
Non capisco come gestire la sezione che analizza le classi annidate. Come scriveresti questa parte del codice?
public class ObjectWalkerEntity
{
public object Value { get; set; }
public PropertyInfo PropertyInfo { get; set; }
}
public static class ObjectWalker
{
// This will be the returned object
static List<ObjectWalkerEntity> objectList = new List<ObjectWalkerEntity>();
public static List<ObjectWalkerEntity> Walk(object o)
{
objectList.Clear();
processObject(o);
return objectList;
}
private static void processObject(object o)
{
if (o == null)
{
return;
}
Type t = o.GetType();
foreach (PropertyInfo pi in t.GetProperties())
{
if (isGeneric(pi.PropertyType))
{
// Add generic object
ObjectWalkerEntity obj = new ObjectWalkerEntity();
obj.PropertyInfo = pi;
obj.Value = pi.GetValue(o, null);
objectList.Add(obj);
}
else
{
////// TODO: Find a way to parse the members of the subclass...
// Parse each member of the non-generic object
foreach (Object item in pi.PropertyType)
{
processObject(item);
}
}
}
return;
}
private static bool isGeneric(Type type)
{
return
Extensions.IsSubclassOfRawGeneric(type, typeof(bool)) ||
Extensions.IsSubclassOfRawGeneric(type, typeof(string)) ||
Extensions.IsSubclassOfRawGeneric(type, typeof(int)) ||
Extensions.IsSubclassOfRawGeneric(type, typeof(UInt16)) ||
Extensions.IsSubclassOfRawGeneric(type, typeof(UInt32)) ||
Extensions.IsSubclassOfRawGeneric(type, typeof(UInt64)) ||
Extensions.IsSubclassOfRawGeneric(type, typeof(DateTime));
}
Edit: Ho usato alcuni dei suggerimenti del Harlam, e si avvicinò con una soluzione di lavoro. Questo gestisce sia le classi nidificate che gli elenchi.
ho sostituito il mio ciclo precedente attraverso il PropertyInfo con il seguente
foreach (PropertyInfo pi in t.GetProperties())
{
if (isGeneric(pi.PropertyType))
{
// Add generic object
ObjectWalkerEntity obj = new ObjectWalkerEntity();
obj.PropertyInfo = pi;
obj.Value = pi.GetValue(o, null);
objectList.Add(obj);
}
else if (isList(pi.PropertyType))
{
// Parse the list
var list = (IList)pi.GetValue(o, null);
foreach (object item in list)
{
processObject(item);
}
}
else
{
// Parse each member of the non-generic object
object value = pi.GetValue(o, null);
processObject(value);
}
}
Ho anche aggiunto un nuovo controllo per vedere se qualcosa è una lista.
private static bool isList(Type type)
{
return
IsSubclassOfRawGeneric(type, typeof(List<>));
}
Grazie per l'aiuto!
È possibile utilizzare il rendimento restituito e inoltre dovrebbe contenere un elenco di oggetti già elaborati per le proprietà di riferimento posteriori. – riezebosch
Funziona quasi, ma sta incontrando un problema con le liste. – Rethic