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

Nei*_*eil 1 c# dynamic

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

dynamic d = GetADynamicThing();
d.Foo();
Run Code Online (Sandbox Code Playgroud)

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

是否有一种简单的方法可以确定D上是否存在Foo()?

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

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

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

3号似乎是动态的目标用法,在COM情况下很好.我之所以问这个问题的原因是为了回应做这样的事情,即使用一些任意创建的对象的方法.这似乎是使用动态的错误情况.

Ree*_*sey 5

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

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