【问题标题】:Is it possible to create a Dynamic tree structure using the ExpandoObject?是否可以使用 ExpandoObject 创建动态树结构?
【发布时间】:2011-05-23 14:59:19
【问题描述】:

目前我正在使用 ExpandoObject 动态存储名字和姓氏。

例如

   // Create Expando object for testing
   dynamic employee = new ExpandoObject();

   // Dynamically add the fields to the expando            
   ((IDictionary<String, Object>)employee).Add("FirstName", "John");
   ((IDictionary<String, Object>)employee).Add("Surname", "Smith"); 

我想知道是否可以将字段动态存储到树结构中,以便我可以拥有名为 Name 的父字段,然后是名为 Firstname 和 Surname 的两个子字段。理想情况下,这可能会扩展到包括更多子级别。我在下面做了一些伪代码来理想地展示我希望它如何工作。 (当然这段代码目前会导致错误)

// Create Expando object for testing
dynamic employee = new ExpandoObject();

// Dynamically add the Name
((IDictionary<String, Object>)employee).Add("Name", "");

//Dynamically add the firstname and surname to employee.Name
((IDictionary<String, Object>)employee.Name).Add("FirstName", "John");
((IDictionary<String, Object>)employee.Name).Add("Surname", "Smith");       

【问题讨论】:

  • 展开?这是哈利波特的咒语吗? +1 有趣的问题
  • @George:是的,我从 2003 年就获得了谷歌认证
  • @sehe,以为您以前从未听说过它,并希望提供链接。纳米
  • @George:我从未听说过。这是一个很好的发现,这就是为什么我表达了我的惊讶。抱歉,如果我有时在 SO 之类的信息网站上太过分了

标签: c# visual-studio-2010 dynamic c#-4.0 expandoobject


【解决方案1】:

什么阻止你做

 dynamic parent = new ExpandoObject();
 parent.Nick = "Dad";
 parent.Name = new ExpandoObject();
 parent.Name.FirstName = "John";
 parent.Name.MiddleName = "Tweeds";
 parent.Name.SurName = "Doe";

 parent.Spouse = new ExpandoObject();
 parent.Spouse.Nick = "Sweety";
 parent.Children = new [] {
     new ExpandoObject(),
     new ExpandoObject()
 };
 parent.Children[0].Nick = "P-J";
 parent.Children[0].Name = "Pete-Jay";
 parent.Children[1].Nick = "Tammie";
 parent.Children[1].Name = "Tamara";

或类似的?您不会完全免费获得树遍历,但这基本上是不使用强类型节点时给定的

更新;我刚刚在 Windows XP 上使用 Mono C# 编译器编译并运行了它。甚至没有安装 MS.NET 4.0 :)

【讨论】:

  • 是的,这是一个选项,但由于它很新,我想知道是否有人围绕树/文件夹视图做了任何有趣的事情。谢谢回答
  • 树/文件夹视图?在我阅读时,这不是您的问题的一部分
  • 没错,我刚刚提到它,因为我正在考虑扩展它以在我的帖子中包含更多子级别,类似于树视图。
【解决方案2】:

使用开源Dynamitey(可以通过nuget安装,是一个可移植的类库),你可以像这样制作expandoobject图:

  using Dynamitey.DynamicObjects;
  ...

  dynamic New = Builder.New<ExpandoObject>();

  var person = New.Person(
      Name: New.Name(FirstName:"John", SurName:"Smith")
  );

您还可以使用一堆嵌套的IDictionary&lt;string,object&gt; 并使用以下方法使它们像具有嵌套动态对象属性的动态对象:

using Dynamitey.DynamicObjects.Dictionary = DynamicDict;
...

dynamic obj = new DynamicDict(nestedDictionaries);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多