怎麼判斷對象的某個屬性是否是
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>