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

时间:2015-01-27 15:33:15

标签: c# generics reflection types

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

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

所有MyBaseClass<T>SomeOtherBaseClassSomeCompletelyOtherBaseClass<T>都继承自同一个基类,但我对此不感兴趣。

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

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

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

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

我想要解决的是 - 能够在switch / case语句中使用它,并且对于从MyBaseClass继承的所有类执行此操作,对于从SomeCompletelyOtherBaseClass继承的所有类都执行此操作。

有什么想法吗?

但是我需要确定T后来就行,所以任何额外的输入欢迎。

1 个答案:

答案 0 :(得分:2)

简单的模型:

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);
    }
  }
}