2011-05-23 29 views
5

en este momento estoy usando el ExpandoObject para almacenar dinámicamente nombre y apellido.¿Es posible crear una estructura de árbol dinámica usando ExpandoObject?

p. Ej.

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

Me preguntaba si es posible almacenar de forma dinámica los campos en una estructura de árbol para que yo pudiera tener el campo de nivel superior denominado Nombre, y luego dos campos secundarios llamados Nombre y Apellido. Idealmente, esto podría expandirse para incluir más subniveles. He hecho un código de psudo a continuación para demostrar de manera ideal cómo me gustaría que funcione. (Por supuesto el código actualmente provoca errores)

// 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

en Expansión? ¿Es eso algún hechizo de Harry Potter? +1 a la pregunta interesante – sehe

+0

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

+0

@George: Sí, estoy certificado por google desde 2003 – sehe

Respuesta

6

Lo que hace que deje de hacer

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 similares? No se obtendría exactamente el recorrido de árbol de forma gratuita, pero eso es básicamente un hecho cuando no se utilizan los nodos de tipos de caracteres

Actualización; Acabo de compilar y ejecuté esto usando el compilador Mono C# en Windows XP. Ni siquiera tener MS.NET 4.0 instalado :)

+0

Sí, esa es una opción, pero como es bastante nuevo, me preguntaba si alguien había hecho algo interesante con él en torno a vistas de árbol/carpeta. gracias por la respuesta – kevchadders

+0

tree/folder views? eso no era parte de tu pregunta cuando lo leí – sehe

+0

Cierto, acabo de mencionarlo porque estaba buscando ampliarlo para incluir más niveles secundarios en mi publicación, similares a una vista en árbol. – kevchadders

4

Uso de la fuente abierta Dynamitey (puede ser a través de instalar Nuget, y es una biblioteca de clases portátil), puede hacer expandoobject gráficos de la siguiente manera:

using Dynamitey.DynamicObjects; 
    ... 

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

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

Usted también puede tomar un montón de anidado IDictionary<string,object> y hacer que se comportan como un objeto dinámico con propiedades de objetos dinámicos anidados utilizando:

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

dynamic obj = new DynamicDict(nestedDictionaries); 
+0

gracias por sus comentarios +1 – kevchadders

Cuestiones relacionadas