动态添加属性到ExpandoObject

时间:2011-02-08 21:01:42

标签: c# c#-4.0 dynamic expandoobject

我想在运行时动态地向ExpandoObject添加属性。所以例如要添加一个字符串属性调用NewProp我想写一些类似

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

这很容易吗?

4 个答案:

答案 0 :(得分:434)

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

可替换地:

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

答案 1 :(得分:23)

如Filip所述 - 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();

答案 2 :(得分:11)

这是一个示例帮助器类,它转换一个Object并返回一个包含给定对象的所有公共属性的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");

答案 3 :(得分:0)

我认为这可以按所需类型添加新属性,而无需设置原始值,就像在类定义中定义属性时一样

var x = new ExpandoObject();
x.NewProp = default(string)