c# - 我何时/为何应使用后期绑定(bind)? (动态对象和 ExpandoObject)

标签 c# dynamic late-binding expandoobject dynamicobject

虽然 DynamicObjectsExpandoObjects ( Differences between ExpandoObject, DynamicObject and dynamic ) 起初听起来非常有用,但我从未真正使用过它们。感觉后期绑定(bind)非常不安全/不稳定,因为它可能会在运行时引发错误,而这些错误本可以避免。一般来说,MSDN 指出了早期绑定(bind)的几个优点,并建议如果可能的话根本不要使用后期绑定(bind) ( https://msdn.microsoft.com/en-us/library/0tcf61s1.aspx )。

因为我从来没有遇到过没有后期绑定(bind)就无法解决的情况,而且它似乎被认为是“不好的风格”,所以我想知道是否有一些情况实际上需要使用后期绑定(bind)。您是否有任何使用后期绑定(bind)(特别是 DynamicObject 或 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# 上下文执行动态语言(例如 IronRuby)。

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

关于c# - 我何时/为何应使用后期绑定(bind)? (动态对象和 ExpandoObject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28426078/

相关文章:

c# - 类型或命名空间名称 'Http' 不存在?

C# "Nested"或 "chained"泛型?

c# - 我想要一个动态静态字段

ios - Swift 3 - 动态与@objc

.net - Createinstance() - 我这样做对吗?

objective-c - 在运行时动态地将方法绑定(bind)到选择器

c# - ASP.Net Web API Xml 序列化问题

c# - 无法从 C# 中的 Web 服务返回自定义类

javascript - 在不改变选取框位置的情况下动态更改选取框文本

c# - 基于CPU架构的dll后期绑定(bind)