2

虽然DynamicObjectsExpandoObjectsExpandoObject、DynamicObject 和 dynamic 之间的区别)起初听起来很有用,但我从未真正使用过它们。感觉后期绑定非常不安全/不稳定,因为它可能会在运行时抛出错误,否则这些错误是可以避免的。一般来说,MSDN 指出了早期绑定的几个优点,并建议尽可能不要使用后期绑定 ( https://msdn.microsoft.com/en-us/library/0tcf61s1.aspx )。

由于我从来没有遇到过没有后期绑定就无法解决的情况,而且它似乎被认为是“糟糕的风格”,我想知道是否存在实际需要使用后期绑定的情况。您是否有任何使用后期绑定(特别是 DynamicObject 或 ExpandoObject)的示例,并且有充分的理由选择这种设计,因为它“易于编码”?

4

1 回答 1

2

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

在某些情况下,使用dynamic可以让你的生活更美好,甚至更多,可以让你做一些没有dynamic.

扩展对象

考虑以下示例(不使用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 反序列化为动态对象,请参见此处的示例。您可以通过DynamicObject!


此外,DLR(以及 C# 中的动态支持)允许您从 C# 上下文执行动态语言(例如,IronRuby)。

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

于 2015-02-10T09:11:09.150 回答