Agregar propiedades desconocidas (en tiempo de diseño) a un ExpandoObject

simplemente explorando c # 4. Tratando de entender todo esto dynamic. Lo siento si esta pregunta es tonta, no hay experiencia en este dominio.

Si tengo un ExpandoObject y deseo agregar propiedades públicas (con get y set) en el tiempo de ejecución, ¿cómo lo haré?

Por ejemplo, tengo documentTemplate y un documento, que tiene una propiedad que apunta hacia documentTemplate. Este documento La plantilla tiene algunos títulos de tags (por ejemplo, capacidades desarrolladas entre los estudiantes), que deben abordarse al hacer el documento (por ejemplo, concentración, memoria, etc.). Entonces, tan pronto como se establece la plantilla en el documento, quiero crear una clase, que tenga propiedades con los mismos nombres que los títulos de las tags en la Plantilla, y luego usar algún elemento de UI, como PropertyGrid, puedo hacer que el usuario complete los valores de las tags con la etiqueta Títulos.

¡Gracias por leer!

Me pregunté cómo sería posible agregar miembros a una clase “sobre la marcha” y se me ocurrió esta muestra:

using System; using System.Collections.Generic; using System.Dynamic; class Program { static void Main() { dynamic expando = new ExpandoObject(); var p = expando as IDictionary; p["A"] = "New val 1"; p["B"] = "New val 2"; Console.WriteLine(expando.A); Console.WriteLine(expando.B); } } 

El objective de este fragmento de código es que los miembros A y B se definen como literales de cadena (codificados / codificados) y se agregan a través de la interfaz IDictionary de ExpandoObject. Probamos la existencia y los valores de las claves (y probamos el concepto) accediéndolos directamente y enviando a la consola.

Es posible agregar propiedades delegadas a un ExpandoObject , que luego actúa (casi) como los métodos. p.ej,

 dynamic obj = new ExpandoObject(); obj.GetDocumentTemplate = () => { ... }; ... obj.GetDocumentTemplate(); // invokes delegate 

Sí, ExpandoObject está diseñado para agregar propiedades dinámicamente a una “bolsa de propiedades”. Sin embargo, no se admite la idea de otorgar tal propiedad a getter y setter. Tal vez eso quede claro si lo piensas un poco: ya no sería una propiedad dinámica si ya sabes lo que deben hacer el getter y el setter. Lo más cercano que puede obtener es implementar el evento INotifyPropertyChanged para que pueda detectar cambios. Algunos ejemplos de código:

 using System; using System.Dynamic; using System.ComponentModel; class Program { static void Main(string[] args) { dynamic obj = new ExpandoObject(); obj.test = 42; // Add a property Console.WriteLine(obj.test); var inpc = (INotifyPropertyChanged)obj; inpc.PropertyChanged += inpc_PropertyChanged; obj.test = "foo"; Console.ReadLine(); } static void inpc_PropertyChanged(object sender, PropertyChangedEventArgs e) { Console.WriteLine("'{0}' property changed", e.PropertyName); } } 

Las respuestas hasta ahora cubren los conceptos básicos bastante bien, pero sentí que valía la pena compartir este artículo de MSDN Magazine:

http://msdn.microsoft.com/en-us/magazine/ff796227.aspx

Cubre algunos ejemplos del uso de entrada XML dinámica para crear y usar dinámicamente ExpandoObjects.

Acabo de descubrir este hecho interesante: los enlaces XAML a un objeto ExpandoObject también crearán las propiedades a las que el enlace está intentando acceder .

Todavía necesito más creatividad para descubrir para qué podría ser bueno. Creación de objeto dynamic en la interfaz de usuario? suena genial: DI intentará algo.