2011-01-27 17 views
42

Estoy tratando de entender el tipo DynamicObject. Encontrado este artículo de MSDN a ser muy conciso y claro como la forma de crear y utilizar DynamicObject:Propiedades de Loop DynamicObject

http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.aspx

El artículo contiene una clase DynamicDictionary simple que hereda de DynamicObject.

Ahora quiero iterar sobre mis propiedades DynamicObject creados de forma dinámica:

dynamic d = new DynamicDictionary(); 
d.Name = "Myname"; 
d.Number = 1080; 

foreach (var prop in d.GetType().GetProperties()) 
{ 
    Console.Write prop.Key; 
    Console.Write prop.Value; 
} 

Obviamente eso no funciona. Quiero aprender cómo hacer esto sin un cambio en mi clase DynamicDictionary, ya que estoy tratando de aprender a usar esto para todos los tipos de objetos existentes que se heredan de DynamicObject.

¿Se necesita reflexión? Me falta algo ...

Respuesta

14

¿Has probado el método DynamicDictionary.GetDynamicMemberNames()? - http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.getdynamicmembernames.aspx

+0

Se ve bien, pero no quiero/no puedo cambiar mi clase y "GetDynamicMemberNames() es una opción, es decir, una clase que hereda de DynamicObject puede anularla si lo desea, pero si no funciona en la base se llama a la clase y devuelve una lista vacía ". – joeriks

+0

Hmm Entiendo. Entonces, creo que o necesita ir a ExpandoObject o necesita implementarlo por su cuenta. – Anuraj

+0

Considero esto como la respuesta gracias – joeriks

45

Creo que le interesaría la clase ExpandoObject. La clase DynamicObject es solo una base donde debe proporcionar toda la lógica. Implementa explícitamente la interfaz IDictionary<string, object> para que pueda acceder a sus propiedades o agregar nuevas de esa manera.

// declare the ExpandoObject 
dynamic expObj = new ExpandoObject(); 
expObj.Name = "MyName"; 
expObj.Number = 1000; 

// print the dynamically added properties 
foreach (KeyValuePair<string, object> kvp in expObj) // enumerating over it exposes the Properties and Values as a KeyValuePair 
    Console.WriteLine("{0} = {1}", kvp.Key, kvp.Value); 

// cast to an IDictionary<string, object> 
IDictionary<string, object> expDict = expObj; 

// add a new property via the dictionary reference 
expDict["Foo"] = "Bar"; 

// verify it's been added on the original dynamic reference 
Console.WriteLine(expObj.Foo); 

yo sólo había dado cuenta de que se está implementando la clase DynamicDictionary y entendido mal su pregunta. Lo siento.

Cuando se utiliza con una referencia dinámica, solo tiene acceso a miembros expuestos públicamente. Dado que solo se declara pública Count (además de los otros miembros DynamicObject), necesitaría usar la función de reflexión para acceder al diccionario interno para obtener fácilmente esos valores (si no tiene la intención de realizar ningún otro cambio).

+0

Ok, gracias, entonces, para un objeto existente que hereda DynamicObject y no expone el diccionario, no hay forma de que yo (otro que utilizar Reflection) para obtener el diccionario de miembros? – joeriks

+0

AFAIK sí. Solo puede acceder a los miembros públicos y a la clase 'DynamicObject' donde el acceso de los miembros se resuelve a través de varios métodos. Alternativamente, podría implementar explícitamente la clase 'IDictionary ' al igual que ExpandoObject para facilitar este proceso. –

+0

p.s., Disculpa, pasé por alto tu pregunta al principio. No noté que en realidad estabas implementando el código de ejemplo. Estaba pensando, "No hay clase' DynamicDictionary' ... ":) –