使用动态功能在运行时附加方法和属性有什么性能影响,如this blog post中所述?
ExpandoObject的实际用途是什么?
答案 0 :(得分:10)
嗯,你不是真的将方法和属性附加到对象上。就CLR而言并非如此。您只是将条目添加到字典中,当ExpandoObject
IDynamicMetaObjectProvider
实现{1}}要求输入属性值(或要求执行该方法)时,它将采取相应的行动。
性能显然比静态绑定访问方法/属性要慢,但DLR非常糟糕。我个人担心的不是性能,而是因为缺乏类型安全性 - 如果没有编译器发现它,错误就会轻易搞砸你的代码。
我个人的建议是只在C#4中使用动态类型,它会带来非常明显的好处......我希望它比较少见(比如不安全的代码)。
ExpandoObject
的用途?不是很多,IMO - 主要是在与其他动态语言交谈时。
答案 1 :(得分:2)
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");