【问题标题】:Dynamically creating an object with dynamic children using data at runtime with ExpandoObject in C#使用 C# 中的 ExpandoObject 在运行时使用数据动态创建具有动态子对象的对象
【发布时间】: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


【解决方案1】:

为了能够使用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&lt;string, object&gt; 演员表:

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);

【讨论】:

  • 谢谢 Ivan,但由于这必须在运行时完成,我必须这样做:dynamic parentDynamic = new ExpandoObject(); parentDynamic["GroupOne"] = new ExpandoObject(); parentDynamic["GroupOne"]["ChildOne"] = new ExpandoObject(); parentDynamic["GroupOne"]["ChildOne"]["Occupation"] = "Plumber"; 字符串都是运行时的动态变量。有了上面我得到这个错误:Cannot apply indexing with [] to an expression of type 'System.Dynamic.ExpandoObject'
  • 嗯,这只是一个例子。重要的部分是使GroupOne 属性ExpandoObject。然后在运行时,您可以将其转换为 IDictionary&lt;string, object&gt;,就像在您的代码中一样。
  • 谢谢伊万。这正是我需要的指导!
猜你喜欢
  • 1970-01-01
  • 2020-04-12
  • 2019-03-25
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 2020-11-11
  • 2023-01-25
相关资源
最近更新 更多