2013-08-06 71 views
3

我有一个“工厂”类,应该比较泛型类类型参数和返回一个对象的特定实例:比较类类型没有实例

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) 

因为智能感知告诉我,T是永远System.ArgumentNullException(我假设,因为T是System.Exception

我怎么能解决这个问题?我必须通过一个System.Exception的实例来检查它的类型或有任何其他方式通过类类型参数做呢?

回答

6

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

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

但是,这就是'is'是。 :) – Atrotygma

+2

@Atrotygma:该'is'操作者只能在像'如果(myObject的是SOMETYPE)'实例使用。 – Oliver

+1

不,“is”关键字会检查某个类型的实例是否可以转换为另一种类型,而不会出现异常。所以首先,你需要一个实例来使用“是”开始。 – nvoigt

2
if (typeof(T) == typeof(ArgumentNullException)) 
{ 
    //your code 
} 
3

如果继承的类型应该得到尊重,用途:

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