开发手册 欢迎您!
软件开发者资料库

.NET(C#)判断泛型类型(List<>)和泛型接口(IEnumerable<>)的继承关系代码

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

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

var type1 = typeof(List<>);var type2 = typeof(IEnumerable<>);//return falsetype2.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));