在 C# 中使用 ExpandoObject 在运行时使用数据动态创建具有动态子对象的对象
Dynamically creating an object with dynamic children using data at runtime with ExpandoObject in C#
我创建了一个动态对象,并在运行时使用 ExpandoObject
为其设置了属性和值
dynamic parentDynamic = new ExpandoObject();
var parentName = "GroupOne";
((IDictionary<String, Object>)parentDynamic)[parentName] = "default";
Console.WriteLine(parentDynamic.GroupOne);
控制台按预期成功输出 "default"。
我还以相同的方式创建了一个具有多个属性的子对象
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 并返回 "Plumber" 或 parentDynamic.GroupOne.ChildOne.FirstName 然后返回 "John"
本来我是想像这样一次完成作业的
parentDynamic["GroupOne"]["ChildOne"]["Occupation"] = "Plumber"
但我收到错误 无法将 [] 的索引应用于 'System.Dynamic.ExpandoObject' 类型的表达式,这就是为什么我要创建父子关系对象并首先将它们转换为 Dictionary 对象。理想情况下,我只想做类似上面的事情,因为它要简单得多。
为了能够使用 parentDynamic.GroupOne.ChildOne
语法,GroupOne
属性 也应该是动态的 ExpandoObject
而在您的情况下它是 string
.
像这样:
dynamic parentDynamic = new ExpandoObject();
parentDynamic.GroupOne = new ExpandoObject();
parentDynamic.GroupOne.ChildOne = new ExpandoObject();
parentDynamic.GroupOne.ChildOne.FirstName = "John";
parentDynamic.GroupOne.ChildOne.LastName = "Smith";
parentDynamic.GroupOne.ChildOne.Occupation = "Plumber";
或使用 IDictionary<string, object>
强制转换:
IDictionary<string, object> parent = new ExpandoObject();
IDictionary<string, object> group = new ExpandoObject();
IDictionary<string, object> child = new ExpandoObject();
child["FirstName"] = "John";
child["LastName"] = "Smith";
child["Occupation"] = "Plumber";
parent["GroupOne"] = group;
group["ChildOne"] = child;
dynamic parentDynamic = parent;
Console.WriteLine(parentDynamic.GroupOne.ChildOne.Occupation);
我创建了一个动态对象,并在运行时使用 ExpandoObject
为其设置了属性和值 dynamic parentDynamic = new ExpandoObject();
var parentName = "GroupOne";
((IDictionary<String, Object>)parentDynamic)[parentName] = "default";
Console.WriteLine(parentDynamic.GroupOne);
控制台按预期成功输出 "default"。
我还以相同的方式创建了一个具有多个属性的子对象
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 并返回 "Plumber" 或 parentDynamic.GroupOne.ChildOne.FirstName 然后返回 "John"
本来我是想像这样一次完成作业的
parentDynamic["GroupOne"]["ChildOne"]["Occupation"] = "Plumber"
但我收到错误 无法将 [] 的索引应用于 'System.Dynamic.ExpandoObject' 类型的表达式,这就是为什么我要创建父子关系对象并首先将它们转换为 Dictionary 对象。理想情况下,我只想做类似上面的事情,因为它要简单得多。
为了能够使用 parentDynamic.GroupOne.ChildOne
语法,GroupOne
属性 也应该是动态的 ExpandoObject
而在您的情况下它是 string
.
像这样:
dynamic parentDynamic = new ExpandoObject();
parentDynamic.GroupOne = new ExpandoObject();
parentDynamic.GroupOne.ChildOne = new ExpandoObject();
parentDynamic.GroupOne.ChildOne.FirstName = "John";
parentDynamic.GroupOne.ChildOne.LastName = "Smith";
parentDynamic.GroupOne.ChildOne.Occupation = "Plumber";
或使用 IDictionary<string, object>
强制转换:
IDictionary<string, object> parent = new ExpandoObject();
IDictionary<string, object> group = new ExpandoObject();
IDictionary<string, object> child = new ExpandoObject();
child["FirstName"] = "John";
child["LastName"] = "Smith";
child["Occupation"] = "Plumber";
parent["GroupOne"] = group;
group["ChildOne"] = child;
dynamic parentDynamic = parent;
Console.WriteLine(parentDynamic.GroupOne.ChildOne.Occupation);