是否可以使用没有类型参数的泛型类?

时间:2018-09-27 10:56:05

标签: c# templates generics

如果我有一个模板化的(通用)类MyClass<T>,是否可以执行以下操作:

var b = someObject is MyClass; // without specifying <T>

3 个答案:

答案 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 {}

如果您指定MyClassMyClass<T>之间的关系,那么您的is运算符将在上面的代码中工作。