向 ExpandoObject 动态添加属性
Posted
技术标签:
【中文标题】向 ExpandoObject 动态添加属性【英文标题】:Dynamically adding properties to an ExpandoObject 【发布时间】:2011-06-23 17:30:33 【问题描述】:我想在运行时。因此,例如添加一个字符串属性调用 NewProp 我想写类似
var x = new ExpandoObject();
x.AddProperty("NewProp", System.String);
这很容易吗?
【问题讨论】:
How to set a property of a C# 4 dynamic object when you have the name in another variable 的可能重复项 【参考方案1】:dynamic x = new ExpandoObject();
x.NewProp = string.Empty;
或者:
var x = new ExpandoObject() as IDictionary<string, Object>;
x.Add("NewProp", string.Empty);
【讨论】:
我从来没有意识到 Expando 实现 IDictionaryError 53 Cannot convert type 'System.Dynamic.ExpandoObject' to 'System.Collections.Generic.IDictionary<string,string>' via a reference conversion, boxing conversion, unboxing conversion, wrapping conversion, or null type conversion
这是IDictionary<string, object>
,而不是IDictionary<string, string>
。
请务必注意,当您转换为 IDictionary
时,不要使用 dynamic
作为变量类型。
如果你实现为 IDictionary,那么你不必强制转换它来使用来自父类或派生类的方法:IDictionary<string, object> myExpando = new ExpandoObject();
【参考方案2】:
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();
【讨论】:
您的代码完全错误,您跳过了最重要的部分,即转换为字典。【参考方案3】:这是一个示例帮助类,它转换一个对象并返回一个具有给定对象的所有公共属性的 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<String, object>;
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");
【讨论】:
"var expandoDict = expando as IDictionary;"此行需要更改为“var expandoDict = expando as IDictionary我认为这会添加所需类型的新属性,而无需设置原始值,例如在类定义中定义属性时
var x = new ExpandoObject();
x.NewProp = default(string)
【讨论】:
嘿莫特萨!纯代码答案可能会解决问题,但如果您解释它们如何解决问题,它们会更有用。社区需要理论和代码才能完全理解您的答案。以上是关于向 ExpandoObject 动态添加属性的主要内容,如果未能解决你的问题,请参考以下文章