0

リフレクションから匿名クラスのインスタンスを取得するには?

私はこの文字列を持っています:
"<object name='hello' id='654' />"

これから不定の属性パラメータ番号(および名前)を使用して、属性とプロパティ、および属性値とプロパティ値の間のマッピングを持つ匿名クラスのインスタンスが必要です。

var anObject = new{name="hello",id=654};

文字列を説明するために xml 形式を使用しましたが、任意の文字列形式からの解決策が必要です(Xml シリアル化は必要ありません)。

Reed Copsey の場合 (必要なコンテキストを抽象化してください)。これを使用して、DefaultRoute を asp.net MVC 3 アプリケーションのマップ ルートに挿入する予定です。

 routes.MapRoute(
        "",
        "superweirdurlwithnostructure.whatever",
        new { controller = "Home", action = "Products", id = 500 }
    );

MVC3でルートを定義するために私の質問ファイルを参照する

4

2 に答える 2

2

この方法で匿名クラスを作成することはできません(少なくとも、CodeDomのようなものを使用して実際にコードを記述およびコンパイルする主要なフープがなければ)。

そうは言っても、これができたとしても、このクラスを使う良い方法はありません。匿名型は、実際には、それらが定義されている関数内での使用を目的としており、コンパイル時にコンパイラーによって生成される完全なクラスに変換されます。

1つのオプションは、潜在的に、以下を使用することdynamicです。

dynamic anObject = new ExpandoObject();
anObject.name = "hello";
anObject.id = 654;

ExpandoObjectIDictionary<string,object>インターフェースを介してこれを使用することもできます。

dynamic anObject = new ExpandoObject();
var setObject = (IDictionary<string,object>)anObject;
setObject["name"] = "hello";
setObject["id"] = 654;

// These can be accessed directly now
Console.WriteLine(anObject.name);
Console.WriteLine(anObject.id);

ただし、これを使用するための優れた方法が必要です。コードが変数にアクセスする方法がわからなくても、型を動的に構築しても多くの問題を解決することはできず、さらに多くの問題を作成するだけです...

于 2012-10-30T16:12:49.037 に答える
0

残念ながら、Reflection.Emitすべてのプロパティを持つ新しいタイプを作成するには、 を使用する必要があります。匿名型は、コンパイラが自動的に定義を作成することを除いて、実際には他のクラスと何ら変わりのないクラスです。

シナリオによっては、dynamic ExpandoObjectオブジェクトが答えになる可能性があります。

于 2012-10-30T16:13:45.273 に答える