Dados los siguientes objetos:
public class Customer {
public String Name { get; set; }
public String Address { get; set; }
}
public class Invoice {
public String ID { get; set; }
public DateTime Date { get; set; }
public Customer BillTo { get; set; }
}
Me gustaría usar la reflexión para pasar por el Invoice
y obtener la Name
propiedad de a Customer
. Esto es lo que busco, asumiendo que este código funcionaría:
Invoice inv = GetDesiredInvoice(); // magic method to get an invoice
PropertyInfo info = inv.GetType().GetProperty("BillTo.Address");
Object val = info.GetValue(inv, null);
Por supuesto, esto falla ya que "BillTo.Address" no es una propiedad válida de la Invoice
clase.
Entonces, intenté escribir un método para dividir la cadena en pedazos en el punto y caminar sobre los objetos buscando el valor final que me interesaba. Funciona bien, pero no me siento del todo cómodo con él:
public Object GetPropValue(String name, Object obj) {
foreach (String part in name.Split('.')) {
if (obj == null) { return null; }
Type type = obj.GetType();
PropertyInfo info = type.GetProperty(part);
if (info == null) { return null; }
obj = info.GetValue(obj, null);
}
return obj;
}
¿Alguna idea sobre cómo mejorar este método o una mejor manera de resolver este problema?
EDITAR después de publicar, vi algunas publicaciones relacionadas ... Sin embargo, no parece haber una respuesta que aborde específicamente esta pregunta. Además, aún me gustaría recibir comentarios sobre mi implementación.
GetDesiredInvoice
te devuelve un objeto de tipo,Invoice
¿por qué no usarloinv.BillTo.Name
directamente?