0

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

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            
}

我想知道这是否可能。

4

1 回答 1

5

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

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为此使用-因为这就是您在这里所拥有的。

于 2013-10-13T19:56:23.020 回答