繁体   English   中英

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

[英]c# dynamic object Runtime Type-Checking

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

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

并且,如果d的运行时类型不包含方法Foo(), 则会引发RunTimeBinderException

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

否则,我们将无法在对象上进行老式的反射,或者依靠try-catch。 不确定我喜欢哪种方法。

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

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

数字3似乎是动态的目标用途,在COM情况下很好 我最初问这个问题的原因是为了响应这样的事情,即使用一些任意创建的对象的方法。 使用动态方法,这似乎是错误的情况。

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

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

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

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

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

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

维修噩梦

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM