在 C# 中,如何确定对象是否属于通用基类型

In C#, How do you find out whether an Object is of a Generic Base Type

作为编写代码生成工具(我的 classes 的客户端库)的一部分,我发现了一个有趣的问题。

我有一组 classes: SomeClass : MyBaseClass<SomeClass> SomeOtherClass : SomeOtherBaseClass ClassC : SomeCompletelyOtherBaseClass<SomeClass>

MyBaseClass<T>SomeOtherBaseClassSomeCompletelyOtherBaseClass<T> 都继承自同一个基础 class,但我对那个不感兴趣。

还有一个反射类型 (System.Type) 作为我的代码的输入。

我想知道的是我的反射类型 - 它继承了这些通用基础中的哪一个 class。

我知道可以使用 IS 运算符,或 IsAssignableFrom,但在这种情况下我不知道泛型是什么。

所以我不能只说 myType.IsAssignableFrom(MyBaseClass<T>),因为我不知道 T,我只有 MyBaseClass 名字。

我想从中得到的是 - 能够在 switch/case 语句中使用它,说对于从 MyBaseClass 继承的所有 classes 这样做,对于从 SomeCompletelyOtherBaseClass 继承的所有这样做。

有什么想法吗?

不过,我需要确定 T 稍后在线,因此欢迎任何其他输入。

简单模型:

namespace Program {

  class MyGeneric<T> { }

  class MyDerived : MyGeneric<String> { }

  class Program {
    public static void Main() {
      MyDerived item = new MyDerived ();
      Boolean isIt = typeof(MyGeneric<>).BaseType.IsAssignableFrom (item.GetType());
      Console.WriteLine (isIt); // Output: "True"

      foreach (Type type in item.GetType().BaseType.GetGenericArguments())
        Console.WriteLine(type.Name);
    }
  }
}