次のオブジェクトが与えられます:
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
直接使用しないのですか?