c#动态对象运行时类型检查

时间:2009-08-27 18:25:20

标签: c# dynamic

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

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

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

是否会有 easy 方式来确定d上是否存在Foo()?

否则,我们会坚持对对象进行旧学校反思,或者依靠try-catch。不确定我喜欢哪种方法。

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

  1. 反射
  2. Catch Exception
  3. 希望GetADynamicThing()返回您希望返回的内容
  4. 3号似乎是COM situations is great中动态的目标用法。我最初问这个问题的原因是回应做something like this,即使用一些任意创建的对象的方法。这似乎是使用动态的错误情况。

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

dynamic类型的重点是假设成员存在。

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

答案 2 :(得分:1)

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

答案 3 :(得分:-1)

如果现在无法找到答案,我希望他们这样做。

维护噩梦