判断IEnumerable<>和判断IEnumerable<T>类型的区别

7 篇文章 0 订阅

怎么判断对象的某个属性是否是IEnumerable<>类型或者派生自IEnumerable<>
有人说用IsAssignableFrom,并不!

结论

昨天跟同学因为这个问题争论一下,有个问题可能没有引起他们足够的重视:
IEnumerable<>IEnumerable<T>是不同的东西

先说结论:


IEnumerable<> 和 IEnumerable<int>是有区别的
1.判断是否继承了IEnumerable<>,用 x.GetGenericTypeDefinition() == enumerableType
2.判断是否继承了IEnumerable<int>,用 enumerableType.IsAssignableFrom(t)

1.判断某个对象是否是或者继承了 IEnumerable

没错,用 TypeA.IsAssignableFrom(TypeB)
如果TypeB : TypeA 结果true,反之false
代码:


public class Test1<T>
{
     public List<T> List1 { get; set; }

     public IEnumerable<T> List2 { get; set; }

     public string Str { get; set; }
 }

static void Main(string[] args)
{
	var props = typeof(Test1<int>).GetProperties();
	
	//把 IEnumerable<int> 缓存 IEnumerable<>就全是false
    var enumerableType = typeof(IEnumerable<int>);
    
    foreach (var p in props)
    {
        var t = p.PropertyType;
        var ifn = p.PropertyType.GetInterfaces();
        if ((t.IsGenericType && enumerableType.IsAssignableFrom(t))
            || (ifn.Any(x => x.IsGenericType && enumerableType.IsAssignableFrom(x))))
        {
            Console.WriteLine(p.Name + ":True");
        }
        else
        {
            Console.WriteLine(p.Name + ":False");
        }
    }

    Console.WriteLine("......");
    Console.ReadKey();
	
}


运行结果

 List1:True
 List2:True
 Str:False
 ......

2.判断某个对象是否是或者继承了 IEnumerable


static void Main(string[] args)
{
 	 var props = typeof(Test1<int>).GetProperties();
     var enumerableType = typeof(IEnumerable<>); //把 IEnumerable<> 缓存 IEnumerable<int>就全是false
     foreach (var p in props)
     {
         var t = p.PropertyType;
         var ifn = p.PropertyType.GetInterfaces();
         if ((t.IsGenericType && t.GetGenericTypeDefinition() == enumerableType)
             || (ifn.Any(x => x.IsGenericType && x.GetGenericTypeDefinition() == enumerableType)))
         {
             Console.WriteLine(p.Name + ":True");
         }
         else
         {
             Console.WriteLine(p.Name + ":False");
         }
     }

     Console.WriteLine("......");
     Console.ReadKey();
 }
 

运行结果
在这里插入图片描述
等等,
为什么Str也是True?
哈哈,因为 string继承了IEnumerable<char>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值