When/Why 我应该使用后期绑定吗? (动态对象和扩展对象)

When/Why should I use late-binding? (DynamicObject and ExpandoObject)

同时 DynamicObjectsExpandoObjects (Differences between ExpandoObject, DynamicObject and dynamic) sound quite useful at first, i did never actually use them. It feels like late-binding is quite unsafe/unstable since it might throw errors at run-time which could've otherwise been avoided. In general MSDN points out several advantages of early-binding and suggests not to use late-binding at all if possible (https://msdn.microsoft.com/en-us/library/0tcf61s1.aspx).

因为我从来没有遇到过没有后期绑定就无法解决的情况,而且似乎被认为是'bad style',我想知道是否有实际需要使用的情况后期绑定。你有没有使用后期绑定(特别是 DynamicObject 或 ExpandoObject)的例子,并且有充分的理由选择这个设计,除了它是 "easy to code"?

大多数时候最好不要使用 dynamic 并坚持 一种类型安全的编程风格。

但是 情况下使用 dynamic 可以让你的生活更美好,甚至更多,可以让你做一些不可能做的非常酷的事情没有 dynamic.

ExpandoObject

考虑以下示例(不使用 ExpandoObject):

Dictionary<String, object> info = new Dictionary<string, object>();
Dictionary<String, object> person = new Dictionary<string,object>();
info["Person"] = person;
person["Name"] = "John";
person["Surname"] = "Smith";

现在使用 ExpandoObject:

dynamic info = new ExpandoObject();
info.Person = new ExpandoObject();
info.Person.Name = "John";
info.Person.Surname = "Smith";

这样不是更好吗?每当您需要某种 属性 包 来操纵对象的大层次结构时,您可以使用 ExpandoObject 而不是字典。但是,如果您有一本普通的小词典,可能最好坚持使用该词典 - 它更清晰并且没有性能开销。

动态对象

现在假设您有庞大的对象层次结构(例如,来自 JSON)。 您可以创建自定义 DynamicObject 以轻松地将 JSON 反序列化为动态对象,请参见示例 here。 您可以通过 DynamicObject!

做很多更酷的事情

此外,DLR(和 C# 中的动态支持)允许您从 C# 上下文执行动态语言 (e.g.IronRuby)。

如您所见,C# 中的动态支持是一个非常强大的概念,但必须只在适当的时候使用。