質問

未知の /匿名オブジェクト(-graph)のプロパティに遅刻 /動的な方法でアクセスできるようにする方法を実装したいと思います(それを正しく呼ぶ方法さえ知りません)。

これが私が達成したいことの例です:

// setup an anonymous object
var a = new { B = new { C = new { I = 33 } } };

// now get the value of a.B.C.I in a late-bound way
var i = Get(a, "B.C.I"); 

そして、これは「クラシック」リフレクションを使用した簡単な実装です:

public static object Get(object obj, string expression)
{
    foreach (var name in expression.Split('.'))
    {
        var property = obj.GetType().GetProperty(name);
        obj = property.GetValue(obj, null);
    }
    return obj;
}

上記のように似たようなものを実装するために、C# / .NET 4で他にどのようなオプションがありますか?

たぶん同じことを達成する方法があります。 expression 文字列の代わりにラムダ式を使用していますか?表現木は何らかの形で役立つでしょう(例:に示すように この質問)?

アップデート: :オブジェクトと式は、Webサービスコールを介してコードに渡されます。それが私が使った理由です objectstring 私の中で Get() 方法。

役に立ちましたか?

解決

あなたは 実際に 式は文字列としてのみありますか?コンパイル時間で知られているのですが、タイプ自体が知られていない(または表現するのが難しい)ということです。もしそうなら:

dynamic d = a;
int i = d.B.C.I;

もし、あんたが 本当 人生をずっと難しくする文字列(ユーザーが入力されたデータとして)としてのみ持っています。また、C#4の機能はどれも本当に役立ちません。 Ironpythonスクリプトなどとして潜在的に評価することができます...

編集:わかりました、アップデート後、あなたは後者の状況にあるように聞こえます - その場合、私は反射を使用するよりも良い方法を知りません。 UIS向けに構築された組み込みのプロパティバインディングの一部は役立つかもしれませんが、私はそれにアクセスするきれいな方法を知りません。

他のヒント

C#スタイルを使用する場合は、Monoコンパイラをアプリケーションのサービスとして使用できます。ここでこれを行う方法について説明します:サービスとしてのモノコンパイラ(MCS)

別のアプローチとして、反射を使用してすべてのオブジェクトのプロパティをexpandOObjectに入れてから、辞書のように使用できます(ExpandOObjectはIDICTIONARYを実装しているため)。または、json.netを使用して呼び出すこともできます JObject.FromObject, 、通常のオブジェクトを辞書のようなスタイルでアクセスできるJobjectに変換します(および追加の利点には再帰的なグラフサポートがあります)。最後に、同じアプローチを使用して、オブジェクトを辞書の辞書に捨てることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top