检查如果type是列表,则返回false

时间:2016-04-05 04:53:40

标签: c# list generics

我试图处理一个属性为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,即使它是一个列表?

2 个答案:

答案 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)
{

}