7

そこIEnumerable<KeyValuePair<string,string>>から、理想的には、キーをプロパティ名として、値をプロパティ値として持つ匿名オブジェクトが必要です。

私はさまざまな選択式(コンパイルさえされていません...)と使用するアプローチExpandoObject(以下を参照)を試しましたが、成功しませんでした。これを行う良い方法はありますか?可能であれば、コレクションに対する余分な明示的な繰り返しを避けたいと思います (つまり、ある種の LINQ ステートメントですべてを行います)。

これは私がこれまでに試したことです。私がやろうとしていることも明確になることを願っています:

var kvps = getProps(); // returns IEnumerable<KeyValuePair<string,string>>

dynamic o = new ExpandoObject();
foreach (var kvp in kvps)
{
    o.Add(kvp);
}

これはコンパイル時には問題ありませんが、実行時に'System.Dynamic.ExpandoObject' に 'Add' の定義が含まれていないというYSODが表示されます。インスタンス化されてからメソッドが追加された場合。奇妙なことに、ExpandoObject の MSDN ドキュメント ページには、いくつかの「明示的に実装されたインターフェイス メソッド」の 1 つとしてリストされています。o.Add() .Add()

これを動的オブジェクトに入れる必要はありません。キーと値のペアのキーと値に従って、プロパティ名と値を持つものを取得する必要があるだけです。

更新:うーん、これは恥ずかしいです。これもXY問題の一種であることがわかりました。

Json(data)コントローラーに戻るだけで、ASP.NET MVC の組み込み機能を使用して、これを JSON にレンダリングしようとしています。答えはすべて、私が最初に尋ねたことを実行するのに非常にうまく機能しましたが、このオブジェクトを渡すと、dataまだ欲しいものが得られません:

// What I get:
[
   { Key: 'firstkey', Value: 'FirstValue' }, 
   { Key: 'secondKey', Value: 'secondValue' } 
]

// What I want:
{ firstKey: 'FirstValue', secondKey: 'secondValue' }

どうやら、ExpandoObject関連するプロパティが追加された はそれをカットしませんでした-レンダリングする前に辞書にキャストされました...

4

3 に答える 3

6

ExpandoObject明示的に実装するIDictionary<string, object>ため、最初にキャストする必要があります。

var kvps = getProps();
dynamic o = new ExpandoObject();
var dict = o as IDictionary<string, object>;
foreach (var kvp in kvps)
{
    dict.Add(kvp.Key, kvp.Value);
}

oこれで、期待どおりに使用できます。

var example = o.YourKey;

コントローラーで Json(data) を返すだけで、ASP.NET MVC の組み込み機能を使用して、これを JSON にレンダリングしようとしています。

面白い。

これを行うには、ExpandoObject ではなく辞書をシリアル化します。MVC 3 の JSON シリアライザーは、辞書を使用して既にそれを行っています。あなたがしなければならないのは、あなたIEnumerable<KeyValuePair<string, object>>を辞書に変換することだけです:

var kvps = getProps();
var dictionary = kvps.ToDictionary(k => k.Key, v => v.Value);
return Json(dictionary, JsonRequestBehavior.AllowGet); //take out allow get if you don't need it.

ダイナミクスは必要ありません。

于 2012-06-25T14:38:00.570 に答える
1

expando オブジェクトを IDictionary にキャストして Add(string, object) を呼び出す必要があると思います

于 2012-06-25T14:37:54.203 に答える