天天看點

判斷IEnumerable<>和判斷IEnumerable<T>類型的差別結論1.判斷某個對象是否是或者繼承了 IEnumerable2.判斷某個對象是否是或者繼承了 IEnumerable

怎麼判斷對象的某個屬性是否是

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();
 }
 
           

運作結果

判斷IEnumerable<>和判斷IEnumerable<T>類型的差別結論1.判斷某個對象是否是或者繼承了 IEnumerable2.判斷某個對象是否是或者繼承了 IEnumerable

等等,

為什麼Str也是True?

哈哈,因為

string

繼承了

IEnumerable<char>