1. ホーム
  2. c#

[解決済み] C#でリフレクションを使ってネストされたオブジェクトのプロパティを取得する

2023-02-28 04:08:14

質問

次のようなオブジェクトがあるとする。

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;
}

この方法を改善するためのアイデア、またはこの問題を解決するためのより良い方法があれば教えてください。

EDIT 投稿後、関連する投稿をいくつか見ましたが...。 しかし、この質問を具体的に解決する回答はないようです。 また、私の実装に対するフィードバックがまだ欲しいです。

どのように解決するのですか?

私は、次のような(ネストされたクラスの)プロパティから値を取得するために、次のメソッドを使用します。

プロパティ

アドレス.ストリート。

"住所.国.名"

    public static object GetPropertyValue(object src, string propName)
    {
        if (src == null) throw new ArgumentException("Value cannot be null.", "src");
        if (propName == null) throw new ArgumentException("Value cannot be null.", "propName");

        if(propName.Contains("."))//complex type nested
        {
            var temp = propName.Split(new char[] { '.' }, 2);
            return GetPropertyValue(GetPropertyValue(src, temp[0]), temp[1]);
        }
        else
        {
            var prop = src.GetType().GetProperty(propName);
            return prop != null ? prop.GetValue(src, null) : null;
        }
    }

以下はFiddleです。 https://dotnetfiddle.net/PvKRH0