在C#4.0中在运行时附加属性和方法?

使用动态function在运行时附加方法和属性有什么性能影响,如本博文中所述?

ExpandoObject的实际用途是什么?

好吧,你并没有真正将方法和属性附加到对象上。 就CLR而言并非如此。 您只是将条目添加到字典中,当IDynamicMetaObjectProviderExpandoObject实现被要求输入属性值(或要求执行该方法)时,它将相应地执行操作。

性能显然比静态绑定访问方法/属性要慢,但DLR非常糟糕。 我个人担心的不是性能,而是因为缺乏类型安全性 – 如果没有编译器发现它,错误就会轻易搞砸你的代码。

我个人的建议是只在C#4中使用动态类型,它给出了非常明显的好处……我希望它比较少见(比如不安全的代码)。

用于ExpandoObject ? 不是很多,IMO – 主要是在与其他动态语言交谈时。

ExpandoObject与DLR有关,主要与在C#和动态语言(也许是IronPython)之间进行游戏有关; 但是,更常见的是,当您的类型的模式仅在运行时已知时,这种类型的property-bag对象可能很有用,可能基于数据库数据/配置数据。 也许是“内部平台”反模式的一个示例,但在特定场景中 ,在运行时附加属性非常有用。 当然,对于纯粹的CLR使用(即没有DLR调用者),您可以使用索引器和字典更简单地执行此操作:

 obj["Name"] = "Fred"; string name = (string) obj["Name"]; 

出于数据绑定的目的,即使使用此方法,您也可以使用自定义属性描述符,通过ICustomTypeDescriptorTypeDescriptionProvider实现完整数据绑定。

或者举一个简单的例子:考虑DataTable ……这部分是你可以在这里做的(同样,在静态类型代码中):(未经测试的例子)

 DataTable table = new DataTable(); table.Columns.Add("Name", typeof(string)); DataRow row = table.Rows.Add("Fred");