作为编写代码生成工具(我的类的客户端库)的一部分,我发现了一个有趣的问题。
我有一组课程:
SomeClass : MyBaseClass<SomeClass>
SomeOtherClass : SomeOtherBaseClass
ClassC : SomeCompletelyOtherBaseClass<SomeClass>
所有MyBaseClass<T>
,SomeOtherBaseClass
和SomeCompletelyOtherBaseClass<T>
都继承自同一个基类,但我对此不感兴趣。
同样作为我的代码的输入,我有一个反射类型(System.Type
)。
我想知道的是我的反射类型 - 它继承了这些通用基类中的哪一个。
我知道可以使用IS运算符或IsAssignableFrom
,但在这种情况下我不知道通用类型是什么。
所以我不能只说myType.IsAssignableFrom(MyBaseClass<T>)
,因为我不知道T
,我所拥有的只是MyBaseClass
名称。
我想要解决的是 - 能够在switch / case语句中使用它,并且对于从MyBaseClass继承的所有类执行此操作,对于从SomeCompletelyOtherBaseClass继承的所有类都执行此操作。
有什么想法吗?
但是我需要确定T
后来就行,所以任何额外的输入欢迎。
答案 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);
}
}
}