动态添加属性到ExpandoObject

Cra*_*aig 215 c# dynamic expandoobject c#-4.0

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

var x = new ExpandoObject();
x.AddProperty("NewProp", System.String);
Run Code Online (Sandbox Code Playgroud)

这很容易吗?

Ste*_*ary 460

dynamic x = new ExpandoObject();
x.NewProp = string.Empty;
Run Code Online (Sandbox Code Playgroud)

或者:

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

  • 我从未意识到Expando*实现了*IDictionary <string,object>.我一直以为演员会将它复制到字典中.但是,您的帖子让我明白,如果您更改词典,您还可以更改基础ExpandoObject!非常感谢 (27认同)
  • 它是`IDictionary <string,object>`,而不是`IDictionary <string,string>`. (21认同)
  • 得到`错误53无法通过引用转换,装箱转换,拆箱转换,包装转换或空类型转换将类型'System.Dynamic.ExpandoObject'转换为'System.Collections.Generic.IDictionary <string,string>' (3认同)
  • @ user123456:属性名称始终是字符串; 他们不能动态.如果"是动态的",你的意思是"直到运行时才知道",那么你必须使用第二个例子.如果"是动态的",你的意思是属性*值*是动态的,那就没关系了.具有动态值可以适用于任何一个示例. (3认同)
  • 如果您实现为 IDictionary,则不必将其强制转换为使用父类或派生类中的方法:`IDictionary&lt;string, object&gt; myExpando = new ExpandoObject();` (3认同)
  • 重要的是要注意,当您转换为“ IDictionary”时,请不要使用“ dynamic”作为变量类型。 (2认同)

Him*_*tel 24

如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();
Run Code Online (Sandbox Code Playgroud)

  • 您的代码完全错误,您跳过了最重要的部分,即转换为字典。 (2认同)

小智 12

这是一个示例帮助器类,它转换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);
            }
        }
Run Code Online (Sandbox Code Playgroud)

用法:

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

//Add Custom Properties
dynamicHelper.AddProperty(expandoObj, "dynamicKey", "Some Value");
Run Code Online (Sandbox Code Playgroud)

  • "var expandoDict = expando as IDictionary;" 此行需要更改为"var expandoDict = expando as IDictionary <String,object>;" (6认同)
  • 为了使其更加出色,请使用它们作为扩展方法。 (3认同)