Учитывая следующие объекты:Использование отражения в C#, чтобы получить свойства вложенного объекта
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;
}
Любые идеи о том, как улучшить этот метод, или лучший способ решить эту проблему?
EDIT после публикации, я видел несколько связанных должностей ... Однако, похоже, нет ответа, который конкретно решает этот вопрос. Кроме того, мне все равно нравятся отзывы о моей реализации.
просто любопытно, если ваш 'GetDesiredInvoice' возвращает вам объект типа' Invoice', почему бы не использовать 'inv.BillTo.Name' напрямую? – ram
Я использую это немного по-другому, просто упрощен для моего примера. Я беру объект и передаю его в процессор, который объединяет его с шаблоном для печати. – jheddings
Он просто чувствовал себя немного «грубой силой» и казался, что должен быть лучший способ. Однако из ответов, похоже, я не был полностью вне базы. – jheddings