Biorąc pod uwagę następujące obiekty:
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; }
}
Chciałbym użyć refleksji, aby przejść przez, Invoiceaby uzyskać Namewłaściwość a Customer. Oto, czego szukam, zakładając, że ten kod zadziała:
Invoice inv = GetDesiredInvoice(); // magic method to get an invoice
PropertyInfo info = inv.GetType().GetProperty("BillTo.Address");
Object val = info.GetValue(inv, null);
Oczywiście kończy się to niepowodzeniem, ponieważ „BillTo.Address” nie jest prawidłową właściwością Invoiceklasy.
Spróbowałem więc napisać metodę dzielenia ciągu na części na kropce i przechodzenia po obiektach w poszukiwaniu interesującej mnie wartości końcowej. Działa dobrze, ale nie do końca mi to odpowiada:
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;
}
Jakieś pomysły na ulepszenie tej metody lub lepszy sposób rozwiązania tego problemu?
EDYTUJ po wysłaniu, widziałem kilka powiązanych postów ... Jednak nie wydaje się, aby istniała odpowiedź, która konkretnie odnosi się do tego pytania. Nadal chciałbym poznać opinie na temat mojej implementacji.
GetDesiredInvoicezwraca ci obiekt typu,Invoicedlaczego nie użyćinv.BillTo.Namebezpośrednio?