2017-04-14 45 views
-1

我想從列表中初始化一個expandoObject。c#從列表中初始化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

這就是我告訴你的。無論你是否使用匿名類,你仍然不能使用枚舉作爲鍵,你必須首先實例化它。 –

+0

好吧,我知道,不能使用枚舉,但我們集中不同的東西,我需要一個解決方案,我發現它。可能是我用錯了你的方式,但它不適合我。如果你有一個工作.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。 (你可以閱讀上面的代碼爲expando.SomeProperty.Value1,其中SomePropertynull。)

所以一旦你設置了對象的某個實例,你可以使用它,但當時沒有在使用ExpandoObject任何多大用處更多:

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'類型的表達式應用索引 –