【问题标题】:When/Why should I use late-binding? (DynamicObject and ExpandoObject)何时/为什么应该使用后期绑定? (DynamicObject 和 ExpandoObject)
【发布时间】:2015-02-10 07:17:02
【问题描述】:

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

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

【问题讨论】:

    标签: c# dynamic late-binding expandoobject dynamicobject


    【解决方案1】:

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

    但是在某些情况下使用dynamic 可以让你的生活更美好,甚至更多,可以让你做一些没有dynamic 就不可能做的很酷的事情。 p>

    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# 中的动态支持是一个非常强大的概念,但只能在适当的时候使用。

    【讨论】:

      猜你喜欢
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 2017-11-07
      • 2019-06-05
      • 2010-09-10
      • 2015-12-05
      • 1970-01-01
      相关资源
      最近更新 更多