本文主要介绍.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));