Agregar propiedades dinámicamente a un ExpandoObject

Resuelto Craig asked hace 13 años • 4 respuestas

Me gustaría agregar propiedades dinámicamente a un ExpandoObject en tiempo de ejecución. Entonces, 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 fácilmente posible?

Craig avatar Feb 09 '11 04:02 Craig
Aceptado
dynamic x = new ExpandoObject();
x.NewProp = string.Empty;

Alternativamente:

var x = new ExpandoObject() as IDictionary<string, Object>;
x.Add("NewProp", string.Empty);
Stephen Cleary avatar Feb 08 '2011 21:02 Stephen Cleary

Como lo explica Filip aquí: http://www.filipekberg.se/2011/10/02/adding-properties-and-methods-to-an-expandoobject-dynamicly/

También puedes agregar un método en tiempo de ejecución.

var x = new ExpandoObject() as IDictionary<string, Object>;
x.Add("Shout", new Action(() => { Console.WriteLine("Hellooo!!!"); }));
x.Shout();
Himanshu Patel avatar Oct 15 '2015 19:10 Himanshu Patel

Aquí hay una clase auxiliar de muestra 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<String, object>;
            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");
Johannes avatar Jan 23 '2017 15:01 Johannes