c# - 判断对象是否是泛型基类的实例,任意泛型类型

标签 c# reflection

我需要在不知道泛型类型参数的情况下测试一个值是否是泛型基类的实例。使用 MSDN example作为示例的基础,这是我想要完成的:

using System;

public class Class1<T> { }
public class DerivedC1 : Class1<int> { }

class IsSubclassTest
{
   public static void Main()
   {
      Console.WriteLine(
          "DerivedC1 subclass of Class1: {0}",
          typeof(DerivedC1).IsSubclassOf(typeof(Class1<>)) // <- Here.
      );
   }
}

虽然这在语法上是正确的,但它总是会产生错误。如果我删除通用类型参数,它会按预期工作(返回 true)。

如何在不知道其泛型类型参数的情况下测试类类型是否是泛型基类的子类?

最佳答案

问题是 DrevidedC1 不是 Class1<T> 的子类, 它是 Class1<int> 的子类.确保您了解这种细微差别; Class1<T>是一个开放类型(T 可以是任何东西,它还没有被设置)而DerivedC1扩展封闭类型 Class1<int> (它不再在 T 中打开,T 设置为 int 且仅 int )。因此,当您执行以下操作时:

 typeof(DerivedC1).IsSubclassOf(typeof(Class1<>))

答案显然是false .

您需要做的是检查 DerivedC1通用类型定义的基类型(将其视为 Class1<int> 的相应开放泛型类型)等于 Class1<T>它显然是这样做的。

因此正确的代码是:

typeof(DerivedC1).BaseType.GetGenericTypeDefinition() == typeof(Class1<>));

或者更好,正如 Matías Fidemraizer 在他的 answer 中所说的那样:

typeof(DerivedC1).BaseType.GetGenericTypeDefinition().IsAssignableFrom(typeof(Class1<>)));

关于c# - 判断对象是否是泛型基类的实例,任意泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37184154/

相关文章:

c# - 如何在 C# 中对整数的特定字节执行 -1?

c# - 格式化从其他网站随机复制的文本的最佳方式?

c# - 无法通过反射访问内部属性

c# - 这个 MVC 项目中的第一行是什么意思?

c# - Azure Batch 并确定 c# 中计算节点上下载的 EXE 的路径

c# - 如何在 HttpWebRequest 中更改原始 IP

c++ - DirectX 11 顶点着色器反射

java - 为接口(interface)创建代理,可以通过@Autowired注入(inject),代理通过关键参数调用不同的实现

php, invokeArgs : parameters changed, 怎么返回呢?

c# - 使用属性变量对列表进行排序