如果我有一个模板化的(通用)类MyClass<T>
,是否可以执行以下操作:
var b = someObject is MyClass; // without specifying <T>
答案 0 :(得分:3)
不,不是,但是您可以使用反射来检查类型:
someObject.GetType().GetGenericTypeDefinition().IsAssignableFrom(typeof(MyClass<>))
答案 1 :(得分:1)
在这里肯定会被误解的一件事是,MyClass<T>
是一种'MyClass'类型,它对类型'T'起作用。
不是这种情况。
在创建实例之前, MyClass<T>
不存在(至少从概念上讲)。每当使用类型参数(例如MyClass<int>
)创建这样的实例时,它就会变成具体的类型。也就是说MyClass<int>
或MyClass<float>
或MyClass<XType>
都是名称相似的不同类。这些类型称为构造类型。使用泛型,您可以重复使用MyClass<>
名称,否则将具有不同名称的类。 Infact通用和非通用实现可以一起存在,并被视为不同的类型。
示例
public class MyClass<T>
{
}
public class MyClass
{
}
private static void Main()
{
if(typeof(MyClass)==typeof(MyClass<>)) { }
else { }
}
如果您调试上述类,您将进入其他部分。
因此,在声明MyClass之前,它根本不是类型。
答案 2 :(得分:0)
MyClass<T>
和MyClass
是2个不相关的类型。您可以自己创建关系并获得您指定的行为。
class MyClass {}
class MyClass<T> : MyClass {}
如果您指定MyClass
和MyClass<T>
之间的关系,那么您的is
运算符将在上面的代码中工作。