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, Invoice
aby uzyskać Name
wł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ą Invoice
klasy.
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.
GetDesiredInvoice
zwraca ci obiekt typu,Invoice
dlaczego nie użyćinv.BillTo.Name
bezpośrednio?