Можно ли создать динамическую древовидную структуру с помощью ExpandoObject?

на данный момент я использую ExpandoObject для динамического хранения имени и фамилии.

e.g.

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

Мне было интересно, можно ли динамически хранить поля в древовидной структуре, чтобы я мог иметь родительское поле с именем «Имя», а затем два дочерних поля с именем «Имя» и «Фамилия». В идеале это потенциально может быть расширено за счет включения большего количества подуровней. Я сделал некоторый псевдокод ниже, чтобы идеально продемонстрировать, как я хотел бы, чтобы он работал. (конечно, этот код в настоящее время вызывает ошибки)

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

person kevchadders    schedule 23.05.2011    source источник
comment
Расширить? Это какое-то заклинание из Гарри Поттера? +1 за интересный вопрос   -  person sehe    schedule 23.05.2011
comment
@sehe, msdn.microsoft.com/en-us/library /   -  person George Duckett    schedule 23.05.2011
comment
@George: Да, я сертифицирован Google с 2003 года.   -  person sehe    schedule 23.05.2011
comment
@sehe, думал, ты никогда не слышал об этом раньше и был бы признателен за ссылку. нм   -  person George Duckett    schedule 23.05.2011
comment
@George: я никогда об этом не слышал. Это хорошая находка, поэтому я выразил свое удивление. Извините, если я иногда слишком увлекаюсь информационным сайтом, таким как SO   -  person sehe    schedule 23.05.2011


Ответы (2)


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

 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.

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

person sehe    schedule 23.05.2011
comment
Да, это вариант, но поскольку он довольно новый, мне было интересно, сделал ли кто-нибудь что-нибудь интересное с ним для просмотра дерева/папки. Спасибо за ответ - person kevchadders; 24.05.2011
comment
просмотр дерева/папки? это не было частью вашего вопроса, когда я его читал - person sehe; 24.05.2011
comment
Правда, я только что упомянул об этом, так как хотел расширить его, чтобы включить в свой пост больше подуровней, похожих на древовидное представление. - person kevchadders; 24.05.2011

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

  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);
person jbtule    schedule 18.07.2011