如何动态构建对象的属性

时间:2013-10-13 19:55:04

标签: .net dynamic

看来,新的“动态”对象让您可以动态创建属性:

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            
}

我想知道这是否可能。

1 个答案:

答案 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 - 因为这就是你在这里所做的。