【问题标题】:c# dynamic object Runtime Type-Checking时间:2019-05-10 标签:c#dynamic object Runtime Type-Checking
【发布时间】:2010-11-23 11:53:38
【问题描述】:

显然,无论 GetADynamicThing() 返回的对象类型如何,以下内容在 c# 4.0 中都是有效的

dynamic d = GetADynamicThing();
d.Foo();

如果 d 的运行时类型不包含方法 Foo(),则抛出 RunTimeBinderException

是否有一种简单方法来确定 Foo() 是否存在于 d 上?

否则,我们会被困在对对象进行旧式反思,或者依赖于 try-catch。不确定我喜欢这两种方法。

更新:所以我们目前有 3 个选项:

  1. 反射
  2. 捕获异常
  3. 希望 GetADynamicThing() 返回您期望它返回的内容

数字 3 似乎是 COM situations is great 中动态的目标用法。我最初问这个问题的原因是为了回应something like this,即使用一些任意创建的对象的方法。这似乎是使用动态的错误情况。

【问题讨论】:

  • 编译器不会捕捉到这个。编译器仍然知道 d 是什么类型。
  • @chollida:不,它没有。在编译时,它知道类型是动态的。它不知道这对于实际类型意味着什么,这有点意思。
  • @Chollida,看看他链接的网站

标签: c# dynamic


【解决方案1】:

动态类型并不是要替代 System.Object。如果您不知道返回的是什么,即使在 C# 4 中,使用 System.Object 或 API 中的具体接口仍然是比使用动态更好的方法。

如果您基本上知道要返回的内容,则动态非常有用。您应该将缺少成员(即:Foo)视为例外情况,在这种情况下,例外是处理此问题的合理方式。

【讨论】:

    【解决方案2】:

    dynamic 类型的全部意义在于假设成员存在。

    如果您在调用方法之前确实需要知道,请使用反射或更好地创建一个具体类型来实现声明Foo() 的接口。我认为如果您需要检查 Foo() 是否是 dynamic 类型的成员,那么 dynamic 对您来说是错误的选择。听起来您需要静态类型检查。

    【讨论】:

      【解决方案3】:

      如果您的架构是如此开放,以至于您不知道 GetADynamicThing 返回的是什么,那么您应该捕获异常或以某种方式使用反射。但是,在大多数情况下,您会很清楚自己应该得到什么,并且可以做出一些假设。

      【讨论】:

        【解决方案4】:

        如果现在没有办法找到,我希望他们知道。

        维护噩梦

        【讨论】:

        • -1,我不相信你是对的。动态的全部意义在于您不一定知道确切的类型,也不需要在编译时知道 - 它是动态绑定的。如果您确实知道类型,请使用对象和明智的强制转换或类型本身,而不是动态的。
        • @Jeff,这种事情让我想起了我在使用 vb6 代码时的一些噩梦。人们会滥用。
        • 当然人们会滥用,就像人们滥用扩展方法、字符串、IDisposable 以及几乎任何其他语言特性一样。滥用不是不向人们提供完成工作所需的工具的借口。
        猜你喜欢
        • 1970-01-01
        • 2020-06-15
        • 2020-10-01
        • 2015-06-14
        • 2011-07-08
        • 2012-02-03
        • 2017-04-15
        • 2021-07-31
        • 2016-01-27
        相关资源
        最近更新 更多