Poiché si desidera poter trovare oggetti su oggetti figlio con nidificazione arbitraria, è necessaria una funzione che è possibile chiamare in modo ricorsivo. Ciò è complicato dal fatto che potresti avere figli che fanno riferimento ai loro genitori, quindi devi tenere traccia di quali oggetti hai visto prima nella tua ricerca.
static bool GetValue(object currentObject, string propName, out object value)
{
// call helper function that keeps track of which objects we've seen before
return GetValue(currentObject, propName, out value, new HashSet<object>());
}
static bool GetValue(object currentObject, string propName, out object value,
HashSet<object> searchedObjects)
{
PropertyInfo propInfo = currentObject.GetType().GetProperty(propName);
if (propInfo != null)
{
value = propInfo.GetValue(currentObject, null);
return true;
}
// search child properties
foreach (PropertyInfo propInfo2 in currentObject.GetType().GetProperties())
{ // ignore indexed properties
if (propInfo2.GetIndexParameters().Length == 0)
{
object newObject = propInfo2.GetValue(currentObject, null);
if (newObject != null && searchedObjects.Add(newObject) &&
GetValue(newObject, propName, out value, searchedObjects))
return true;
}
}
// property not found here
value = null;
return false;
}
Se si sa che cosa bambino oggetto la vostra proprietà è in voi può semplicemente passare il percorso ad esso, in questo modo:
public bool GetValue(string pathName, out object fieldValue)
{
object currentObject = _currentObject;
string[] fieldNames = pathName.Split(".");
foreach (string fieldName in fieldNames)
{
// Get type of current record
Type curentRecordType = currentObject.GetType();
PropertyInfo property = curentRecordType.GetProperty(fieldName);
if (property != null)
{
currentObject = property.GetValue(currentObject, null).ToString();
}
else
{
fieldValue = null;
return false;
}
}
fieldValue = currentObject;
return true;
}
Invece di chiamare piace GetValue("foo", out val)
si chiamerebbe come GetValue("foo.bar", out val)
.
Hai un problema o c'è un'altra domanda qui? – leppie
ha modificato la mia domanda, serve un modo per accedere al valore della proprietà dell'oggetto figlio. – iniki