Учитывая следующие объекты:
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; }
}
Я хотел бы использовать отражение, чтобы пройти через, Invoice
чтобы получить Name
свойство Customer
. Вот что мне нужно, если этот код будет работать:
Invoice inv = GetDesiredInvoice(); // magic method to get an invoice
PropertyInfo info = inv.GetType().GetProperty("BillTo.Address");
Object val = info.GetValue(inv, null);
Конечно, это не удается, поскольку BillTo.Address не является допустимым свойством Invoice
класса.
Итак, я попытался написать метод, чтобы разбить строку на части по периоду и пройтись по объектам в поисках окончательного значения, которое меня интересовало. Он работает нормально, но мне это не совсем удобно:
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;
}
Есть идеи, как улучшить этот метод или как лучше решить эту проблему?
ИЗМЕНИТЬ после публикации, я увидел несколько связанных сообщений ... Однако, похоже, нет ответа, который конкретно касается этого вопроса. Также мне хотелось бы получить отзывы о моей реализации.
GetDesiredInvoice
вернете вам объект типа,Invoice
почему бы не использоватьinv.BillTo.Name
напрямую?