2011-05-23 3 views
5

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

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

EXPANDO? Это какое-то заклинание Гарри Поттера? +1 для интересующего вопроса – sehe

+0

@sehe, http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject.aspx –

+0

@George: Да, я сертифицирован Google с 2003 года – sehe

ответ

6

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

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

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

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

+0

Да, это вариант, но, поскольку его совершенно новый, мне было интересно, если бы кто-нибудь сделал что-нибудь интересное с ним вокруг представлений о деревьях/папках. спасибо за ответ – kevchadders

+0

просмотр дерева/папки? это не было частью вашего вопроса, так как я читал его. – sehe

+0

Правда, я только что упомянул об этом, поскольку я изучал его расширение, включив в свой пост больше подуровней, похожих на древовидную структуру. – kevchadders

4

Используя открытый источник 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); 
+0

спасибо за ваши комментарии +1 – kevchadders