看来,新的“动态”对象让您可以动态创建属性:
dynamic v = new object();
v.x = "a";
v.y = "b";
...
我想知道是否有一种简单的方法以编程方式创建属性。例如,假设我的属性存储在列表中,如下所示:
Tuple<string, string>[] list = new Tuple<string, string>[] {
new Tuple<string, string>("x", "a"),
new Tuple<string, string>("y", "b"),
};
我想迭代这个列表并获得与之前相同的结果。
dynamic v = new object();
foreach (Tuple<string, string> keyValue in list) {
// somehow create a property on v that is named keyValue.Item1 and has a value KeyValue.Item2
}
我想知道这是否可能。
答案 0 :(得分:5)
您的初始代码不正确。它会在执行时失败。如果您使用ExpandoObject
,然后它将起作用 - 而然后您也可以使用ExpandoObject
实现{IDictionary<string, object>
的事实以编程方式执行此操作{1}}。但是,它使用显式接口实现来实现它,因此您需要首先使用该类型的表达式。例如:
dynamic d = new ExpandoObject();
IDictionary<string, object> dictionary = d;
dictionary["key"] = "value";
Console.WriteLine(d.key); // Prints "value"
或者你的例子:
dynamic v = new ExpandoObject();
IDictionary<string, object> dictionary = v;
foreach (Tuple<string, string> keyValue in list)
{
dictionary[keyValue.Item1] = keyValue.Item2;
}
顺便说一句,我个人使用KeyValuePair
而不是Tuple
- 因为这就是你在这里所做的。