2017-04-14 18 views
-1

ListからexpandoObjectを初期化したい。リストからexpandoobjectを初期化する<T>

internal class CarKeyValue { 
    public CarKey CarKey { get; set; } 
    public string Value1 { get; set; } 
    public string Value2 { get; set; } 
} 

public enum CarKey { 
    Brand = 1, 
    Model = 2, 
    Year = 3, 
    FactoryLocation = 4, 
    //more than 400 key here... 
} 

var car = new List<CarKeyValue>{ 
    new CarKeyValue {CarKey = CarKey.Brand, Value1 = "Ford"}, 
    new CarKeyValue {CarKey = CarKey.Model, Value1 = "Focus",Value2 = "Titanium"}, 
    new CarKeyValue {CarKey = CarKey.Year, Value1 = "1995"}, 
    new CarKeyValue {CarKey = CarKey.FactoryLocation, Value1 = "Turkey",Value2="Bursa"}, 
     }; 

dynamic expando = new ExpandoObject(); 
foreach(var item in car){ 
    expando.[item.CarKey].Value1 = item.Value1; 
//Incorrect primary expression. 
    expando.[item.CarKey].Value2 = item.Value2; 
} 

どうすればいいですか?私はExpando Objectを使う必要があります。 IDictionary<string,dynamic>を使用しようとしましたが、別の例外がスローされました。

可能な方法はありますか?

答えて

0

私の解決方法はこちらです。私はIDictionaryを使用します。 Foo()やその他のものを使う必要はありません。このコードブロックはうまく機能します。

IDictionary<string,dynamic> expando = new ExpandoObject(); 
foreach(var item in car) { 
    expando.Add(item.CarKey.ToString(),null); 
    expando[item.CarKey.ToString()] = new { Value1 = item.Value1,Value2 = item.Value2 }; 
} 
+0

それは私があなたに言ったことです。匿名クラスを使用するかどうかに関わらず、enumをキーとして使用することはできず、まずインスタンス化する必要があります。 –

+0

私が知っているのは、enumを使うことはできませんが、私たちはさまざまなことに焦点を当てました。私は解決策が必要でした。私はあなたの道を間違って使うかもしれないが、それは私のために働いていない。あなたが働いているなら.netのフィドルの例は私はそれを見たいです。 –

0

はい、できますが、意味がありません。 expandoオブジェクトをIDictionary<string, object>またはIDictionary<string, dynamic>にキャストする必要があります。

IDictionary<string, object> expando = new ExpandoObject(); 
foreach (var item in car) 
{ 
    expando[item.CarKey.ToString()].Value1 = item.Value1; 
} 

expando[item.CarKey.ToString()]に値を割り当てないため、上記のコードは失敗します。代わりに、存在しないオブジェクトからプロパティを設定する必要があります。通常のコードではNullReferenceExceptionがここにスローされます。あなたが何かのインスタンスにオブジェクトを設定したら、あなたはそれを使用することができますので、

を(あなたは。SomePropertynullあるexpando.SomeProperty.Value1として上記のコードを、読むことができる)が、その後ExpandoObjectいずれかを使用して多くの使用はありませんmore:

Foo foo = new Foo(); 
expando[item.CarKey.ToString()] = foo; 
foo.Value1 = item.Value1; 
+0

私はそれを試してみますが、もう一度失敗します。注:私の質問については申し訳ありません。私は間違って書いた 'expando [item.CarKey] .Value1 = item.Value1;'私は私の質問を編集しました。真のコードは 'expando。[item.CarKey] .Value1 = item.Value1;' –

+0

あなたは私の答えで何もしなかった。 –

+0

いいえ私はFoo()で試していません 'expando [item.CarKey.ToString()] = foo;'が例外をスローします:追加情報:[]でインデックス付けを 'System.Dynamic.ExpandoObject'の式に適用できません –

関連する問題