【发布时间】:2016-06-17 05:58:00
【问题描述】:
我创建了一个动态对象并在运行时使用 ExpandoObject 为其设置属性和值
dynamic parentDynamic = new ExpandoObject();
var parentName = "GroupOne";
((IDictionary<String, Object>)parentDynamic)[parentName] = "default";
Console.WriteLine(parentDynamic.GroupOne);
控制台按预期成功输出“默认”。
我还以相同的方式创建了一个具有多个属性的子对象
dynamic childDynamic = new ExpandoObject();
var childProperty1 = "FirstName";
var childProperty2 = "LastName";
var childProperty3 = "Occupation";
((IDictionary<String, Object>)childDynamic)[childProperty1] = "John";
((IDictionary<String, Object>)childDynamic)[childProperty2] = "Smith";
((IDictionary<String, Object>)childDynamic)[childProperty3] = "Plumber";
Console.WriteLine(childDynamic.Occupation);
控制台按预期成功输出“Plumber”。
当我尝试将 childDynamic 对象添加到 parentDynamic 对象并在运行时为其命名时,我遇到了麻烦。这是我最近失败的尝试:
var childName = "ChildOne";
((IDictionary<String, Object>)((IDictionary<String, Object>)parentDynamic)[parentName])[childName] = childDynamic;
Console.Write(parentDynamic.GroupOne.ChildOne.Occupation);
我在尝试分配时遇到的错误是:无法将“System.String”类型的对象转换为“System.Collections.Generic.IDictionary`2[System.String,System.Object]” .
基本上我希望能够访问 parentDynamic.GroupOne.ChildOne.Occupation 并取回“管道工”或 parentDynamic.GroupOne.ChildOne.FirstName 并取回“约翰”
最初我想像这样一次性完成所有任务
parentDynamic["GroupOne"]["ChildOne"]["Occupation"] = "Plumber"
但我得到错误 Cannot apply indexing with [] to an expression of type 'System.Dynamic.ExpandoObject' 这就是为什么我走上了创建父子对象和强制转换的道路首先将它们作为 Dictionary 对象。理想情况下,我想做类似上面的事情,因为它更简单。
【问题讨论】:
-
嗯,您将类型设置为字符串,就在上面。它的值将是
default,然后您尝试将该值转换为字典。 -
但我也不能将它转换为字典中的字典,可以吗?我尝试了一些这种变化无济于事。 ((IDictionary
, Object>)parentDynamic)[parentName] = "default"; -
不确定您的确切意思,但使用动态不允许您将类型转换为无效类型。在您上面的评论中,
parentDynamic.GroupOne = "default";,后来您试图假装parentDynamic.GroupOne是一本字典,但事实并非如此。而不是分配给它"default",你应该给它分配一个字典 -
看看this的文章。
-
像
parentDynamic["GroupOne"]["ChildOne"].Occupation = "Plumber"那样一次完成所有分配是否更有意义,但我收到错误无法将 [] 索引应用于“System.Dynamic.ExpandoObject”类型的表达式'
标签: c# .net dynamic expandoobject