虽然 DynamicObjects
和 ExpandoObjects
( 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/