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 };
}
我想从 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 };
}