Dado que desea poder encontrar objetos en objetos secundarios anidados arbitrariamente, necesita una función que pueda llamar recursivamente. Esto se complica por el hecho de que puede tener hijos que vuelvan a referirse a sus padres, por lo que debe hacer un seguimiento de los objetos que ha visto antes en su búsqueda.
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;
}
Si sabe qué niño objeto Su propiedad está en que sólo puede pasar la ruta al mismo, así:
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;
}
en lugar de llamarlo como GetValue("foo", out val)
que lo llamarían como GetValue("foo.bar", out val)
.
¿Tienes algún problema o tienes otra pregunta aquí? – leppie
edité mi pregunta, necesito una forma de acceder al valor de la propiedad del objeto hijo. – iniki