Враховуючи такі об’єкти:
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безпосередньо?