2015-11-19 14 views
5

JSON.NETを使用してJSONファイルをC#のdynamicオブジェクトに逆シリアル化しています。C# 'dynamic'オブジェクトの動的メンバーを参照する

メソッドの中で、stringを渡して、動的オブジェクトの指定された属性を参照したいと思います。例えば

は:

public void Update(string Key, string Value) 
    { 
     File.Key = Value; 
    } 
Fileは、動的オブジェクトをある

、そしてKeyはに渡される文字列であり、私は、キー「foo」と「barの値を渡したいのですが言います。 」、私はどうなる: Update("foo", "bar");を、しかし原因dynamicオブジェクト型の性質のために、これは

{ 
"Key":"bar" 
} 

、その結果とは対照的に:

{ 
"foo":"bar" 
} 

私はここで動的オブジェクトを要求していますか?

答えて

4

動的オブジェクトは、インデックスの実装方法に依存しますが、これはJson.NET JObjectまたは類似であれば、私はそれが動作することを期待したい
public void Update(string key, string Value) 
{ 
    File[key] = Value; 
} 

。一般的なdynamic表現では動作することが保証されていないことを理解することは重要です。

少なくともクラス内でこのような操作が必要な場合は、フィールドタイプとしてJObjectを使用し、必要に応じてdynamicとして公開することを検討することもできます。

+0

あなたは本当に正しいです、私は約3秒であなたにそれを打ち負かしました:) –

+1

@SeanMissingham:これをもっと明確にすることについての提案については私の答えの最後を見てください。 –

+0

ちょうどそれを見た、ありがとう!最高の説明のために答えとしてこれをマークします:) –

2

さて、私は特別です。ここでは、これを偶然見つけ出す可能性のあるものに対する答えがあります。

あなたは、単に配列インデックスのようなキーを使うことができます。だから、:

File[Key] = Value;はとにかく感謝 File.Key = Value;

とは対照的に、私は必要なように動作します!私は容疑者あなたが使用することができ

+1

本当にC#とJavaScriptの間の顕著な違いです:あなたはランタイムエラーになるだろう

dynamic File = new ExpandoObject(); 

として上記の例ではFileを宣言した場合はJavaScript file.Foo Inをし、「[フーファイル"]は同等です。 C#はこれを採用していますが、見た目には一貫性がありません。他の宣言の比較については、[this](http://stackoverflow.com/a/33808136/1016343)も参照してください。 – Matt

1

JSON.NETのJObjectを使用している場合は、これを行うことができます。 ExpandoObjectでは機能しません。

例:

void Main() 
{ 
    var j = new Newtonsoft.Json.Linq.JObject(); 
    var key = "myKey"; 
    var value = "Hello World!"; 
    j[key] = value; 
    Console.WriteLine(j["myKey"]); 
} 

この単純な例でのプリントの "Hello World!"予想通り。したがって、

var File = new Newtonsoft.Json.Linq.JObject(); 
public void Update(string key, string Value) 
{ 
    File[key] = Value; 
} 

あなたが期待することはありますか?

CS0021 Cannot apply indexing with [] to an expression of type 'ExpandoObject'

関連する問題