【问题标题】:Compare class type without instance比较没有实例的类类型
【发布时间】:2013-08-06 08:13:07
【问题描述】:

我有一个“工厂”类,它应该比较通用类类型参数并返回对象的特定实例:

public static class MyExceptionFactory<T> where T: System.Exception {
    public static MyReturnObj Create() {
        // return instance of MyReturnObj based on type of T
    }
}

但我无法检查例如T 是 ArgumentNullException 因为 T 是类型参数而不是变量

if(T is ArgumentNullException) // won't work

.. 而且,我无法检查 T 的类型

if(typeof(T) is ArgumentNullException)

因为 IntelliSense 告诉我 T 永远不是 System.ArgumentNullException(我假设因为 T 是 System.Exception

我该如何解决这个问题?我是否必须传递一个 System.Exception 的实例来检查它的类型,还是有任何其他方法可以通过类类型参数来做到这一点?

【问题讨论】:

    标签: c# .net exception generics types


    【解决方案1】:

    你有两个类型标识符,你只需要比较类型。

    if(typeof(T) == typeof(ArgumentNullException))
    {
       ...
    }
    

    【讨论】:

    • 但这就是is 的用途。 :)
    • @Atrotygma:is 运算符只能用于像 if(myObject is SomeType) 这样的实例。
    • 不,“is”关键字检查一个类型的实例是否可以无异常地转换为另一种类型。因此,首先,您需要一个实例以使用“is”开头。
    • where T: System.Exception, new()var ex = new T(); 修复了它。创建实例可能有点不必要,但它使用is 完成了这项工作。谢谢你的帮助——显然我需要睡觉。 ://
    • @Atrotygma 是的,创建实例并对其进行约束是不必要的。您可以使用 typeof。这是完成这项工作的正确工具。
    【解决方案2】:

    如果应该尊重继承的类型,请使用:

    if(typeof(ArgumentNullException).IsAssignableFrom(typeof(T)))
    {
    ...
    }
    

    【讨论】:

      【解决方案3】:
      if (typeof(T) == typeof(ArgumentNullException))
      {
          //your code
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-12
        • 1970-01-01
        • 2020-02-18
        • 1970-01-01
        • 2021-02-01
        相关资源
        最近更新 更多