何时/为什么要使用后期绑定? (DynamicObject和ExpandoObject)

时间:2015-02-10 07:17:03

标签: c# dynamic late-binding expandoobject dynamicobject

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

由于我从未遇到过没有后期绑定而无法解决的情况,因为它似乎被认为是“糟糕的风格”,我想知道是否存在实际需要使用后期绑定的情况。你有任何你使用后期绑定的例子(特别是DynamicObject或ExpandoObject),并且有一个很好的理由让这个设计选择因为它“易于编码”而感到高兴吗?

1 个答案:

答案 0 :(得分:2)

大多数情况下,最好不要使用dynamic并遵守 一种类型安全的编程风格。

情况下使用dynamic可以让你的生活更美好,甚至更多,可以让你做一些真正很酷的事情,如果没有{{1} }。

ExpandoObject

考虑以下示例(不使用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"; 而不是字典。但是如果你有一个简单的小字典,可能最好坚持使用字典 - 它更清晰,没有性能开销。

DynamicObject

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


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

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