【问题标题】:How to test if MethodInfo.ReturnType is type of System.Void?如何测试 MethodInfo.ReturnType 是否为 System.Void 类型?
【发布时间】:2009-11-30 14:47:22
【问题描述】:

使用反射获取MethodInfo,我想测试返回的类型是不是typeof System.Void。

测试它是否是 System.Int32 工作正常

 myMethodInfo.ReturnType == typeof(System.Int32)

但是

 myMethodInfo.ReturnType == typeof(System.Void)

不编译?目前我正在测试名称的字符串表示是否为“System.Void”,这似乎非常错误。

【问题讨论】:

  • 您在构建该代码时遇到了什么错误?
  • 如果一个方法返回Void,就意味着它没有返回任何东西,那么为什么不颠倒逻辑,检查一下可以返回什么?只是一个想法......
  • 编译器说“System.Void 不能在 C# 中使用——使用 typeof(void) 来获取 void 类型”。啊,只是阅读错误。 DOH!

标签: c# reflection methodinfo


【解决方案1】:

您不能直接使用System.Void,但可以使用typeof(void) 访问它。

一些人指出(here 和 cmets 中的 here 例如)这是因为 ECMA Standard 335,分区 II,第 9.4 节说:

以下几种类型不能 在实例化中用作参数 (泛型类型或方法):

  • Byref 类型(例如,System.Generic.Collection.List 1<string&> 无效)
  • 包含可以指向 CIL 的字段的值类型 评估堆栈(例如,List<System.RuntimeArgumentHandle>
  • 无效(例如,List<System.Void> 无效)

【讨论】:

  • 不再隐藏错误窗口! ;) 但这太奇怪了。
【解决方案2】:

当我构建这个时,我得到了错误:

不能从 C# 中使用 System.Void -- 使用 typeof(void) 来获取 void 类型对象

这就是答案……

【讨论】:

    【解决方案3】:

    使用

    if(methodInfo.ReturnType.Name == "Void"){
      // Your Code.........
    }
    

    【讨论】:

    • 我可以创建一个类并将其命名为 Void,至少检查 Fullname 是否为 'System.Void',仍然丑陋得要命
    猜你喜欢
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2017-08-06
    • 1970-01-01
    相关资源
    最近更新 更多