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

本文介绍了如何在.NET(C#)中检查泛型类型是否实现或继承了泛型接口。由于IsAssignableFrom()方法无法直接完成此任务,作者提供了一个自定义方法IsAssignableToOpenGenericType(),该方法遍历类型及其接口,判断它们是否匹配给定的泛型接口定义。示例代码展示了如何使用这个方法来正确识别List<>和IEnumerable<>之间的继承关系。
摘要由CSDN通过智能技术生成

本文主要介绍.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));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值