Angesichts der folgenden Objekte:
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; }
}
Ich würde gerne Reflexion verwenden, um durch das Invoice
zu gehen , um das Name
Eigentum von a zu erhalten Customer
. Ich gehe davon aus, dass dieser Code funktionieren würde:
Invoice inv = GetDesiredInvoice(); // magic method to get an invoice
PropertyInfo info = inv.GetType().GetProperty("BillTo.Address");
Object val = info.GetValue(inv, null);
Dies schlägt natürlich fehl, da "BillTo.Address" keine gültige Eigenschaft der Invoice
Klasse ist.
Also habe ich versucht, eine Methode zu schreiben, um die Zeichenfolge in der Periode in Teile zu teilen und die Objekte auf der Suche nach dem endgültigen Wert zu durchsuchen, an dem ich interessiert war. Es funktioniert in Ordnung, aber ich bin damit nicht ganz zufrieden:
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;
}
Irgendwelche Ideen, wie man diese Methode verbessern oder wie man dieses Problem besser lösen kann?
Nach dem Posten BEARBEITEN habe ich einige verwandte Beiträge gesehen ... Es scheint jedoch keine Antwort zu geben, die sich speziell mit dieser Frage befasst. Außerdem möchte ich immer noch das Feedback zu meiner Implementierung.
GetDesiredInvoice
Sie ein Objekt vom Typ zurückgeben,Invoice
warum nichtinv.BillTo.Name
direkt verwenden?