2011-02-08 25 views
175

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

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

Es esto puede hacerse con facilidad?

+0

posible duplicado de [Cómo establecer una propiedad de un objeto dinámico C# 4 cuando se tiene el nombre en otra variable] (http://stackoverflow.com/questions/ 3033410/how-to-set-a-property-of-ac-sharp-4-dynamic-object-when-you-have-the-name-in-an) – nawfal

Respuesta

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

alternativa:

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

Nunca me había dado cuenta de que Expando * implementa * IDictionary . Siempre pensé que el elenco lo copiaría en un diccionario. Sin embargo, su publicación me hizo entender que si cambia el diccionario, también cambia el ExpandoObject subyacente. Muchas gracias – Dyna

+0

Es increíble, y he demostrado que se están convirtiendo en propiedades del objeto con código de muestra en mi publicación en http://stackoverflow.com/questions/11888144/name-variable-using-string-net/ 11893463 # 11893463, gracias –

+2

obteniendo 'Error No se puede convertir el tipo 'System.Dynamic.ExpandoObject' en 'System.Collections.Generic.IDictionary ' a través de una conversión de referencia, conversión de boxeo, conversión de unboxing, conversión de embalaje , o conversión de tipo nulo' – TheVillageIdiot

4

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"); 
+1

"var expandoDict = expando como IDictionary;" esta línea necesita cambiar a "var expandoDict = expando como IDictionary ;" –

Cuestiones relacionadas