c# crear - Agregando dinámicamente propiedades a un ExpandoObject




objetos dinamicamente (4)

dynamic x = new ExpandoObject();
x.NewProp = string.Empty;

Alternativamente:

var x = new ExpandoObject() as IDictionary<string, Object>;
x.Add("NewProp", string.Empty);

Me gustaría agregar dinámicamente propiedades a un ExpandoObject en tiempo de ejecución. Por ejemplo, para agregar una propiedad de cadena llamada NewProp, me gustaría escribir algo como

var x = new ExpandoObject();
x.AddProperty("NewProp", System.String);

¿Es esto posible fácilmente?


Aquí hay una clase auxiliar de ejemplo que convierte un Objeto y devuelve un Expando con todas las propiedades públicas del objeto dado.


    public static class dynamicHelper
        {
            public static ExpandoObject convertToExpando(object obj)
            {
                //Get Properties Using Reflections
                BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;
                PropertyInfo[] properties = obj.GetType().GetProperties(flags);

                //Add Them to a new Expando
                ExpandoObject expando = new ExpandoObject();
                foreach (PropertyInfo property in properties)
                {
                    AddProperty(expando, property.Name, property.GetValue(obj));
                }

                return expando;
            }

            public static void AddProperty(ExpandoObject expando, string propertyName, object propertyValue)
            {
                //Take use of the IDictionary implementation
                var expandoDict = expando as IDictionary;
                if (expandoDict.ContainsKey(propertyName))
                    expandoDict[propertyName] = propertyValue;
                else
                    expandoDict.Add(propertyName, propertyValue);
            }
        }

Uso:

//Create Dynamic Object
dynamic expandoObj= dynamicHelper.convertToExpando(myObject);

//Add Custom Properties
dynamicHelper.AddProperty(expandoObj, "dynamicKey", "Some Value");


Si piensa en el problema que estamos tratando de resolver, no es una enumeración que necesitamos en absoluto. Necesitamos un objeto que permita asociar un cierto número de valores entre sí; en otras palabras, para definir una clase.

El patrón de enumeración de tipo seguro de Jakub Šturc es la mejor opción que veo aquí.

Míralo:

  • Tiene un constructor privado por lo que solo la clase en sí puede definir los valores permitidos.
  • Es una clase sellada, por lo que los valores no pueden modificarse a través de la herencia.
  • Es de tipo seguro, permitiendo que sus métodos requieran solo ese tipo.
  • No hay un impacto en el rendimiento de la reflexión incurrido al acceder a los valores.
  • Y, por último, se puede modificar para asociar más de dos campos juntos, por ejemplo, un Nombre, una Descripción y un Valor numérico.




c# c#-4.0 dynamic expandoobject