【问题标题】:How does C# DynamicObject internally work?C# DynamicObject 在内部是如何工作的?
【发布时间】:2014-03-22 03:46:06
【问题描述】:

我读到了dynamic 及其对语言的贡献。 DLR 管理对对象成员 (dynamic) 的任何调用,为此它使用反射机制。但我无法理解 DynamicObject 类型(内部)的行为。

当您从 DynamicObject 继承时,您可能会创建类似于现有 ExpandoObject 的东西,您需要覆盖 TrySetMember TryGetMember 等方法。我的问题是:当你做 object.method 时,它是如何传递给我们类的 TryGetMember 的,乍一看似乎是 DynamicObject绑定到 DLR,但我对此表示怀疑。

【问题讨论】:

  • 您是否尝试过阅读描述动态对象的书籍或论坛?或者至少你问过谷歌同样的问题?
  • @OleksandrPshenychnyy 我用谷歌搜索,但所有结果都与功能有关,我正在寻找背后的东西。我有红色的书籍和材料都解释了功能,但没有提及内部实现。
  • 我在 Jeffrey Richter 的书“CLR via C#”中读到了它。要解释的内容确实很多,我不确定我是否记得所有内容 - 你最好也阅读一下。简而言之,它编译了您使用“If”语句检查动态对象 .GetType() 结果编写的代码的几个版本。如果无法预测类型,则使用反射。
  • @OleksandrPshenychnyy 谢谢我会找到那本书。我到了使用反射的部分,但这并不能证明如果我执行 object.method 会在调用 TryInvokeMember 时透明地转换。一种解释可能是指示 DLR 在查找某些不存在的方法时任意调用此方法。最后一个是真还是假是我正在寻找的答案。

标签: c# dynamic


【解决方案1】:

评论中已澄清问题的答案。

虽然我不确定,但我认为 TryInvokeMember 等函数只是对反射进行包装,以克服反射的基本设计问题——它只抛出一种异常:TargetInvocationException。所有其他异常,包括您正在调用的方法中的您自己的异常,都使用 TargetInvocationException 进行包装。

动态变量没有这个问题——它们抛出的 excaption 与最初抛出的完全相同。虽然在某些情况下它们仍然在内部使用反射,但它们应该解开底层异常。我认为这是 TryInvokeMember 和相关方法的目的。它还使 CLR 的开发人员能够以更适当和特殊的方式处理对不存在成员的调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多