Динамическое добавление свойств в ExpandoObject
Я хотел бы динамически добавлять свойства к ExpandoObject во время выполнения. Так, например, чтобы добавить строковое свойство call NewProp я хотел бы написать что-то вроде
var x = new ExpandoObject();
x.AddProperty("NewProp", System.String);
это легко возможно?
3 ответа:
dynamic x = new ExpandoObject(); x.NewProp = string.Empty;
кроме того:
var x = new ExpandoObject() as IDictionary<string, Object>; x.Add("NewProp", string.Empty);
Как объяснил здесь Филип - http://www.filipekberg.se/2011/10/02/adding-properties-and-methods-to-an-expandoobject-dynamicly/
вы можете добавить метод тоже во время выполнения.
x.Add("Shout", new Action(() => { Console.WriteLine("Hellooo!!!"); })); x.Shout();
вот пример вспомогательного класса, который преобразует объект и возвращает Expando со всеми общедоступными свойствами данного объекта.
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); } }
использование:
//Create Dynamic Object dynamic expandoObj= dynamicHelper.convertToExpando(myObject); //Add Custom Properties dynamicHelper.AddProperty(expandoObj, "dynamicKey", "Some Value");