使用与字符串相同的名称向ExpandoObject添加属性

32
仅翻译以下内容:

有没有一种方法可以添加一个与字符串值同名的属性到ExpandoObject中?

例如,如果我有:

string propName = "ProductNumber";
dynamic obj = new System.Dynamic.ExpandoObject();

我可以这样创建属性ProductNumber:

obj.ProductNumber = 123;

但是,我能否基于字符串propName创建属性obj.ProductNumber呢?因此,如果我事先不知道属性的名称,我可以根据这个输入创建它。如果使用ExpandoObject不可能实现这一点,那么我应该在C#的其他领域寻找哪些方法呢?


可能是向ExpandoObject添加在设计时未知的属性的重复问题。 - stijn
以上内容的实际应用可在此处找到:https://dev59.com/vXA85IYBdhLWcg3wCe5Z - Nic
2个回答

44

ExpandoObject 实现 IDictionary<string, object> 接口:

((IDictionary<string, object>)obj)[propName] = propValue

我不确定是否可以在使用dynamic引用时使用索引器语法(即不使用强制转换),但你可以尝试并查看结果。


1
你不能像在第一个示例中那样索引ExpandoObject。 - Mike Corcoran
1
第二个例子很好。第一个例子会报错:Cannot apply indexing with [] to an expression of type 'System.Dynamic.ExpandoObject' - Paul
1
@Paul 谢谢 - 我忘记了索引器是显式接口实现。回答已经编辑过了。 - phoog
@VBRonPaulFan 是的,我忘记了接口实现是显式的。我已经编辑了答案。 - phoog
1
哇,我太高兴了发现这篇文章。之前我还在跟着其他教程实现动态对象的一些功能,现在终于有更好的方法了。真是节省了我不少时间和精力!谢谢!! :D - Tony

20

ExpandoObject强制转换为IDictionary<string,object>来实现此操作:

string propName = "ProductNumber";
dynamic obj = new System.Dynamic.ExpandoObject();
var dict = (IDictionary<string,object>)obj;
dict[propName] = 123;

1
+1 至少提到 ExpandoObject 在底层是 IDictionary<string,object>请参阅文档 - Joseph Yaduvanshi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接