5

给定以下类层次结构

public abstract class MyGenericClass<T1, T2> 
{
    public T1 Foo { get; set; }
    public T2 Bar { get; set; }
}

public class BobGeneric : MyGenericClass<int, string>{}
public class JimGeneric : MyGenericClass<System.Net.Cookie, System.OverflowException>{}

我本以为我可以做到以下几点

//All types in the assembly containing BobGeneric and JimGeneric
var allTypes = _asm.GetTypes();  

//This works for interfaces, but not here 
var specialTypes = allTypes.Where(x => typeof(MyGenericClass<,>).IsAssignableFrom(x))

//This also fails
typeof(BobGeneric).IsSubclassOf(typeof(MyGenericClass<,>)).Dump();

我将如何确定BobGeneric继承自的代码MyGenericClass

4

1 回答 1

7

您正在寻找GetGenericTypeDefinition

typeof(BobGeneric).GetGenericTypeDefinition().IsSubclassOf(typeof(MyGenericClass<,>)).Dump();

您可以将该方法想象为“剥离”所有泛型类型参数,只留下原始定义及其形式泛型参数。

如果它不能直接在 上工作BobGeneric,您可能必须在类型层次结构中向上导航,直到找到MyGenericClass<...,...>(或任何IsGenericType返回的类型true)。

于 2013-07-01T18:25:26.947 回答