When/Why 我应该使用后期绑定吗? (动态对象和扩展对象)
When/Why should I use late-binding? (DynamicObject and ExpandoObject)
同时 DynamicObjects
和 ExpandoObjects
(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# 中的动态支持是一个非常强大的概念,但必须只在适当的时候使用。
同时 DynamicObjects
和 ExpandoObjects
(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# 中的动态支持是一个非常强大的概念,但必须只在适当的时候使用。