怎么判断对象的某个属性是否是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>