我试图处理一个属性为List<T>
的泛型类。但是,使用IsAssignableFrom
检查属性时它无效。
代码段:
var type = model.GetType();
var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
int colorIndex = 0;
foreach (var property in properties)
{
if (typeof(List<>).IsAssignableFrom(property.PropertyType))
{
//codes here
}
}
我在这里遗漏了什么吗?为什么它不将该属性视为List,即使它是一个列表?
答案 0 :(得分:7)
在model
对象中,您拥有具有特定类型的属性,例如List<string>
,List<int>
或类似内容。我是你的代码但是你正在测试开放泛型类型。这些类型不一样,因此您无法在if
语句中获得匹配。要解决此问题,您应该使用函数GetGenericTypeDefinition()
来获取基础开放泛型类型:
foreach (var property in properties)
{
if (property.PropertyType.IsGenericType &&
typeof(List<>).IsAssignableFrom(property.PropertyType.GetGenericTypeDefinition()))
{
//codes here
}
}
答案 1 :(得分:3)
您可以尝试检查项目是否实现IList,因此请检查“合同”而不是具体类:
if (typeof(IList).IsAssignableFrom(property.PropertyType)
{
}