Estoy intentando acceder a varias partes de una estructura de clase anidada utilizando una cadena arbitraria .Propiedad de búsqueda en el gráfico de objetos a través de una cadena
Dadas las clases (artificiales) siguientes:
public class Person
{
public Address PersonsAddress { get; set; }
}
public class Adddress
{
public PhoneNumber HousePhone { get; set; }
}
public class PhoneNumber
{
public string Number { get; set; }
}
Me gustaría ser capaz de conseguir el objeto en "PersonsAddress.HousePhone.Number"
desde una instancia del objeto Person
.
Actualmente estoy haciendo algunas búsquedas funky recursivas usando la reflexión, pero espero que algunos ninjas tengan mejores ideas.
Para referencia, aquí es el método (cutre) que he desarrollado:
private static object ObjectFromString(object basePoint, IEnumerable<string> pathToSearch)
{
var numberOfPaths = pathToSearch.Count();
if (numberOfPaths == 0)
return null;
var type = basePoint.GetType();
var properties = type.GetProperties();
var currentPath = pathToSearch.First();
var propertyInfo = properties.FirstOrDefault(prop => prop.Name == currentPath);
if (propertyInfo == null)
return null;
var property = propertyInfo.GetValue(basePoint, null);
if (numberOfPaths == 1)
return property;
return ObjectFromString(property, pathToSearch.Skip(1));
}
¿Por qué crees que debes hacer esto? –
@Steve - Porque necesito controlar la proyección de tipos arbitrarios, y la configuración es el mejor lugar para eso. – Khanzor
Esto también es útil para implementar un mecanismo de enlace de datos genérico: la propiedad DataMember de BindingSource acepta una cadena de ruta de navegación como esa. – ducu