c# 从列表 <T> 初始化 expandoobject

c# initialize expandoobject from list<T>

我想从 List 中初始化一个 expandoObject。

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 对象。我尝试使用 IDictionary<string,dynamic> 但那引发了另一个异常。

有什么办法吗?

是的,你可以,但这没有任何意义。您必须将 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,其中SomeProperty就是null。)

因此,一旦您将对象设置为某物的实例,就可以使用它,但是再使用 ExpandoObject 就没有多大用处了:

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

我的解决方案在这里。我使用 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 };
}