Можно ли создать динамическую древовидную структуру, используя ExpandoObject? - PullRequest
5 голосов
/ 23 мая 2011

В настоящее время я использую 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и фамилияВ идеале это может быть расширено, чтобы включить больше подуровней.Я сделал некоторый псевдокод ниже, чтобы идеально продемонстрировать, как я бы хотел, чтобы он работал.(конечно, этот код в настоящее время вызывает ошибки)

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

Ответы [ 2 ]

6 голосов
/ 23 мая 2011

Что мешает вам делать

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

или подобное?Вы бы точно не получили обход дерева бесплатно, но это, как правило, дано, если не использовать узлы strongtypes

Update ;Я только что скомпилировал и запустил это, используя Mono C # компилятор на Windows XP.Даже не установлен MS.NET 4.0:)

4 голосов
/ 18 июля 2011

Используя открытый исходный код Dynamitey (может быть установлен через nuget и является переносной библиотекой классов), вы можете создавать графики расширения объектов следующим образом:

  using Dynamitey.DynamicObjects;
  ...

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

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

Вы также можете взятьнабор вложенных IDictionary<string,object> и заставить их действовать как динамический объект со свойствами вложенного динамического объекта, используя:

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

dynamic obj = new DynamicDict(nestedDictionaries);
...