2011-05-23 5 views
5

al momento sto usando ExpandoObject per memorizzare dinamicamente nome e cognome.È possibile creare una struttura ad albero dinamica usando ExpandoObject?

ad es.

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

Mi chiedevo se è possibile memorizzare in modo dinamico i campi in una struttura ad albero in modo che io possa avere il campo padre chiamato Nome, e poi due campi di bambini chiamati Nome e Cognome. Idealmente questo potrebbe potenzialmente essere espanso per includere più livelli secondari. Ho fatto un po 'di codice di psudo qui sotto per dimostrare idealmente come vorrei che funzionasse. (Naturalmente questo codice attualmente causa errori)

// 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? E 'un incantesimo di Harry Potter? +1 per la domanda interessante – sehe

+0

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

+0

@George: Sì, sono certificata da google dal 2003 – sehe

risposta

6

Cosa vi impedisce di fare

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

o simili? Non otterresti esattamente l'attraversamento di alberi gratis, ma è fondamentalmente un dato quando non usi i nodi strongtypes

Aggiornamento; Ho appena compilato e eseguito questo utilizzando il compilatore Mono C# su Windows XP. Nemmeno avendo MS.NET 4.0 installato :)

+0

Sì, questa è un'opzione ma dato che è abbastanza nuova mi chiedevo se qualcuno avesse fatto qualcosa di interessante con esso attorno ad albero/cartelle viste. grazie per la risposta – kevchadders

+0

visualizzazioni albero/cartella? quello non era parte della tua domanda mentre lo leggevo – sehe

+0

Vero, l'ho appena menzionato mentre stavo cercando di espanderlo per includere più livelli secondari nel mio post simile a una visualizzazione ad albero. – kevchadders

4

Utilizzando l'Open source Dynamitey (può essere installa tramite NuGet, ed è una libreria di classi Portable), è possibile effettuare expandoobject grafici come questo:

using Dynamitey.DynamicObjects; 
    ... 

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

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

È può anche prendere un po 'di nidificato IDictionary<string,object> e farli agire come un oggetto dinamico con nidificati proprietà degli oggetti dinamici utilizzando:

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

dynamic obj = new DynamicDict(nestedDictionaries); 
+0

grazie per i tuoi commenti +1 – kevchadders