显然,无论GetADynamicThing()返回的对象类型如何,以下内容在c#4.0中都有效
dynamic d = GetADynamicThing();
d.Foo();
如果d的运行时类型不包含方法Foo(),则抛出RunTimeBinderException。
是否会有 easy 方式来确定d上是否存在Foo()?
否则,我们会坚持对对象进行旧学校反思,或者依靠try-catch。不确定我喜欢哪种方法。
更新:所以我们目前有3个选项:
3号似乎是COM situations is great中动态的目标用法。我最初问这个问题的原因是回应做something like this,即使用一些任意创建的对象的方法。这似乎是使用动态的错误情况。
答案 0 :(得分:5)
动态类型并不是System.Object的替代品。如果您不知道返回了什么,那么使用System.Object或API中的具体接口仍然是比使用动态更好的方法,即使在C#4中也是如此。
如果您基本上知道要返回的内容,那么动态非常有用。您应该将缺少的成员(即:Foo)视为例外情况,在这种情况下,异常是处理此问题的合理方式。
答案 1 :(得分:2)
dynamic
类型的重点是假设成员存在。
如果在调用方法之前确实需要知道使用反射或更好地创建具体类型,则实现一个声明Foo()
的接口。我认为,如果您需要检查Foo()
是dynamic
类型的成员,那么dynamic
对您来说是错误的选择。听起来你需要静态类型检查。
答案 2 :(得分:1)
如果您的架构是如此开放,以至于您不知道GetADynamicThing返回了什么,那么您应该捕获异常或以某种方式使用反射。但是,在大多数情况下,你会很清楚你应该得到什么,并且可以做出一些假设。
答案 3 :(得分:-1)
如果现在无法找到答案,我希望他们这样做。
维护噩梦