1

未知の/匿名のオブジェクト(-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サービス呼び出しを介してコードに渡されます。それが私が私の方法で使用objectした理由です。stringGet()

4

2 に答える 2

2

あなたは実際に文字列としての式しか持っていませんか?コンパイル時に、型自体が不明(または表現が難しい)であることがわかっていますか?もしそうなら:

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

本当に文字列として(たとえば、ユーザーが入力したデータとして)それを持っているだけで、生活が非常に難しくなり、C#4の機能のどれも実際には役に立ちません。IronPythonスクリプトまたはそのようなものとして評価できる可能性があります...

編集:さて、更新後は後者の状況にあるように聞こえます-その場合、私はリフレクションを使用するよりも良い方法を知りません。UI用に構築された組み込みのプロパティバインディングのいくつかは役立つかもしれませんが、それにアクセスするためのクリーンな方法がわかりません。

于 2010-09-07T13:46:09.040 に答える
1

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

別のアプローチとして、リフレクションを使用してオブジェクトのすべてのプロパティをExpandoObjectに入れ、それを辞書のように使用することができます(ExpandoObjectはIDictionaryを実装しているため)。または、JSON.NETを使用してを呼び出すこともできますJObject.FromObject。これにより、通常のオブジェクトが辞書のようなスタイルでアクセスできるJObjectに変換されます(追加の利点として、再帰的なグラフがサポートされます)。最後に、同じアプローチを使用して、オブジェクトを辞書の辞書にダンプできます。

于 2010-09-07T13:58:54.073 に答える