检查通用类型

时间:2009-08-14 08:59:08

标签: c# generics

我想检查泛型变量是否属于某种类型但不想检查通用部分。

假设我有List<int>的变量和List<double>的另一个变量。我只想检查它是否为List<>

类型
if(variable is List) {}

而不是

if (variable is List<int> || variable is List<double>) {}

这可能吗?

由于

3 个答案:

答案 0 :(得分:9)

variable.GetType().IsGenericType && 
            variable.GetType().GetGenericTypeDefinition() == typeof(List<>)

当然,这只适用于变量属于List<T>类型且不是派生类的情况。如果要检查它是List<T>还是从它继承,您应该遍历继承层次结构并检查每个基类的上述语句:

static bool IsList(object obj)
{
    Type t = obj.GetType();
    do {
        if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(List<>))
            return true;
        t = t.BaseType;
    } while (t != null);
    return false;
}

答案 1 :(得分:6)

您可以通过反射测试完全类型:

    object list = new List<int>();

    Type type = list.GetType();
    if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>))
    {
        Console.WriteLine("is a List-of-" + type.GetGenericArguments()[0].Name);
    }

就个人而言,我会寻找IList<T> - 比具体的List<T>更通用:

    foreach (Type interfaceType in type.GetInterfaces())
    {
        if (interfaceType.IsGenericType
            && interfaceType.GetGenericTypeDefinition()
            == typeof(IList<>))
        {
            Console.WriteLine("Is an IList-of-" +
                interfaceType.GetGenericArguments()[0].Name);
        }
    }

答案 2 :(得分:5)

Type t = variable.GetType();
if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(List<>))
{
    // do something
}