虽然DynamicObjects
和ExpandoObjects
(Differences between ExpandoObject, DynamicObject and dynamic)听起来非常有用,但我从未真正使用它们。感觉后期绑定非常不安全/不稳定,因为它可能会在运行时抛出错误,否则可能会被避免。一般来说,MSDN指出了早期绑定的几个优点,并建议尽可能不使用后期绑定(https://msdn.microsoft.com/en-us/library/0tcf61s1.aspx)。
由于我从未遇到过没有后期绑定而无法解决的情况,因为它似乎被认为是“糟糕的风格”,我想知道是否存在实际需要使用后期绑定的情况。你有任何你使用后期绑定的例子(特别是DynamicObject或ExpandoObject),并且有一个很好的理由让这个设计选择因为它“易于编码”而感到高兴吗?
答案 0 :(得分:2)
大多数情况下,最好不要使用dynamic
并遵守
一种类型安全的编程风格。
但有情况下使用dynamic
可以让你的生活更美好,甚至更多,可以让你做一些真正很酷的事情,如果没有{{1} }。
考虑以下示例(不使用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";
而不是字典。但是如果你有一个简单的小字典,可能最好坚持使用字典 - 它更清晰,没有性能开销。
现在假设您拥有庞大的对象层次结构(例如,来自JSON)。
您可以创建自定义ExpandoObject
以轻松地将JSON反序列化为动态对象,请参阅示例here。
你可以通过DynamicObject
来做更多很酷的事情!
另外,DLR(以及C#中的动态支持)允许您从C#上下文中执行动态语言(例如,IronRuby)。
如您所见,C#中的动态支持是一个非常强大的概念,但必须在适当的时候使用。