Bootstrap
本文主要介绍.NET(C#)中,判断某个泛型类型与泛型接口之间继承关系的代码,.NET中没有直接的方法判断。

1、通过IsAssignableFrom()方法判断的问题

var type1 = typeof(List<>);
var type2 = typeof(IEnumerable<>);
//return false
type2.IsAssignableFrom(type1);
//通过IsAssignableFrom()方法判断,方法返回是false,判断不出来它们之间的继承关系。

2、通过自定义方法判断它们之间的继承关系

public static bool IsAssignableToOpenGenericType(Type givenType, Type genericType)
{
    var interfaceTypes = givenType.GetInterfaces();
    foreach (var it in interfaceTypes)
    {
        if (it.IsGenericType && it.GetGenericTypeDefinition() == genericType)
            return true;
    }
    if (givenType.IsGenericType && givenType.GetGenericTypeDefinition() == genericType)
        return true;
    Type baseType = givenType.BaseType;
    if (baseType == null) return false;
    return IsAssignableToGenericType(baseType, genericType);
}
//IsAssignableToOpenGenericType()使用示例代码
    var typ1 = typeof(List<>);
    var typ2 = typeof(IEnumerable<>);
    //true, List<>的类型定义包含一个IEnumerable<>
    Console.WriteLine(IsAssignableToOpenGenericType(typ1, typ2));
    //false,IEnumerable<>的类型定义不包含List<>
    Console.WriteLine(IsAssignableToOpenGenericType(typ2, typ1));