在C#4.0中在运行时附加属性和方法?
使用动态function在运行时附加方法和属性有什么性能影响,如本博文中所述?
ExpandoObject的实际用途是什么?
好吧,你并没有真正将方法和属性附加到对象上。 就CLR而言并非如此。 您只是将条目添加到字典中,当IDynamicMetaObjectProvider
的ExpandoObject
实现被要求输入属性值(或要求执行该方法)时,它将相应地执行操作。
性能显然比静态绑定访问方法/属性要慢,但DLR非常糟糕。 我个人担心的不是性能,而是因为缺乏类型安全性 – 如果没有编译器发现它,错误就会轻易搞砸你的代码。
我个人的建议是只在C#4中使用动态类型,它给出了非常明显的好处……我希望它比较少见(比如不安全的代码)。
用于ExpandoObject
? 不是很多,IMO – 主要是在与其他动态语言交谈时。
ExpandoObject
与DLR有关,主要与在C#和动态语言(也许是IronPython)之间进行游戏有关; 但是,更常见的是,当您的类型的模式仅在运行时已知时,这种类型的property-bag对象可能很有用,可能基于数据库数据/配置数据。 也许是“内部平台”反模式的一个示例,但在特定场景中 ,在运行时附加属性非常有用。 当然,对于纯粹的CLR使用(即没有DLR调用者),您可以使用索引器和字典更简单地执行此操作:
obj["Name"] = "Fred"; string name = (string) obj["Name"];
出于数据绑定的目的,即使使用此方法,您也可以使用自定义属性描述符,通过ICustomTypeDescriptor
或TypeDescriptionProvider
实现完整数据绑定。
或者举一个简单的例子:考虑DataTable
……这部分是你可以在这里做的(同样,在静态类型代码中):(未经测试的例子)
DataTable table = new DataTable(); table.Columns.Add("Name", typeof(string)); DataRow row = table.Rows.Add("Fred");