如何动态构建对象的属性

Pet*_*ter 0 .net dynamic

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

dynamic v = new object();
v.x = "a";
v.y = "b";
...
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种简单的方法以编程方式创建属性.例如,假设我的属性存储在列表中,如下所示:

Tuple<string, string>[] list = new Tuple<string, string>[] {
  new Tuple<string, string>("x", "a"),
  new Tuple<string, string>("y", "b"),
};
Run Code Online (Sandbox Code Playgroud)

我想迭代这个列表并获得与之前相同的结果.

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            
}
Run Code Online (Sandbox Code Playgroud)

我想知道这是否可能.

Jon*_*eet 5

您的初始代码不正确.它会在执行时失败.如果您使用ExpandoObject,那么它将工作 - 然后您也可以使用ExpandoObject实现的事实以编程方式执行IDictionary<string, object>.但是,它使用显式接口实现来实现它,因此您需要首先使用该类型的表达式.例如:

dynamic d = new ExpandoObject();
IDictionary<string, object> dictionary = d;
dictionary["key"] = "value";
Console.WriteLine(d.key); // Prints "value"
Run Code Online (Sandbox Code Playgroud)

或者为你的例子:

dynamic v = new ExpandoObject();
IDictionary<string, object> dictionary = v;
foreach (Tuple<string, string> keyValue in list)
{
    dictionary[keyValue.Item1] = keyValue.Item2;
}
Run Code Online (Sandbox Code Playgroud)

我个人使用KeyValuePair而不是Tuple顺便使用 - 因为这就是你在这里所拥有的.