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

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

结论

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

先说结论:


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

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

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


public class Test1
{
     public List List1 { get; set; }

     public IEnumerable List2 { get; set; }

     public string Str { get; set; }
 }

static void Main(string[] args)
{
	var props = typeof(Test1).GetProperties();
	
	//把 IEnumerable 缓存 IEnumerable<>就全是false
    var enumerableType = typeof(IEnumerable);
    
    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).GetProperties();
     var enumerableType = typeof(IEnumerable<>); //把 IEnumerable<> 缓存 IEnumerable就全是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();
 }
 

运行结果
判断IEnumerable<>和判断IEnumerable<T>类型的区别_第1张图片
等等,
为什么Str也是True?
哈哈,因为 string继承了IEnumerable

你可能感兴趣的:(.net,编程,c#,泛型判断,IEnumerable)