如何检查给定值是否为通用列表?


Answers:


92
using System.Collections;

if(value is IList && value.GetType().IsGenericType) {

}

4
这不起作用-我得到以下异常-值为IList使用通用类型'System.Collections.Generic.IList <T>'需要类型参数'

15
您需要使用System.Collections添加;在您的源文件之上。我建议的IList接口不是通用版本(因此进行了第二次检查)
James Couvares 09年

1
你是对的。这就像一个魅力。我在“监视”窗口中对此进行了测试,却完全忘记了缺少的名称空间。我更好,更简单地喜欢此解决方案

3
这行不通。我想在4.0 IList <T>!= IList吗?无论如何,我必须检查它是否是通用且IEnumerable的,然后检查要检查的属性是否存在“计数”。我认为这种弱点部分是为什么WCF会将所有List <T>都转换为T []的原因。

1
@Edza不正确。这通常是因为工作List<T>ObservableCollection<T>实施IList
HappyNomad

121

对于喜欢使用扩展方法的人们:

public static bool IsGenericList(this object o)
{
    var oType = o.GetType();
    return (oType.IsGenericType && (oType.GetGenericTypeDefinition() == typeof(List<>)));
}

因此,我们可以这样做:

if(o.IsGenericList())
{
 //...
}

3
对于.Net Core,需要稍加修改以return oType.GetTypeInfo().IsGenericType && oType.GetGenericTypeDefinition() == typeof(List<>);
Rob L

奇迹般有效!如果您只有类型而不是对象,那么它将为您工作!谢谢!!
gatsby

检查IList<>会更安全吗?
nl-x

14
 bool isList = o.GetType().IsGenericType 
                && o.GetType().GetGenericTypeDefinition() == typeof(IList<>));

6
public bool IsList(object value) {
    return value is IList 
        || IsGenericList(value);
}

public bool IsGenericList(object value) {
    var type = value.GetType();
    return type.IsGenericType
        && typeof(List<>) == type.GetGenericTypeDefinition();
}

5
if(value is IList && value.GetType().GetGenericArguments().Length > 0)
{

}

我认为您需要调用GetType(),例如value.GetType()。GetGenericArguments()。Length> 0
ScottS

4

根据Victor Rodrigues的回答,我们可以设计出另一种泛型方法。实际上,原始解决方案可以简化为仅两行:

public static bool IsGenericList(this object Value)
{
    var t = Value.GetType();
    return t.IsGenericType && t.GetGenericTypeDefinition() == typeof(List<>);
}

public static bool IsGenericList<T>(this object Value)
{
    var t = Value.GetType();
    return t.IsGenericType && t.GetGenericTypeDefinition() == typeof(List<T>);
}

3

这是一个可以在.NET Standard中运行并针对接口运行的实现:

    public static bool ImplementsGenericInterface(this Type type, Type interfaceType)
    {
        return type
            .GetTypeInfo()
            .ImplementedInterfaces
            .Any(x => x.GetTypeInfo().IsGenericType && x.GetGenericTypeDefinition() == interfaceType);
    }

这是测试(xunit):

    [Fact]
    public void ImplementsGenericInterface_List_IsValidInterfaceTypes()
    {
        var list = new List<string>();
        Assert.True(list.GetType().ImplementsGenericInterface(typeof(IList<>)));
        Assert.True(list.GetType().ImplementsGenericInterface(typeof(IEnumerable<>)));
        Assert.True(list.GetType().ImplementsGenericInterface(typeof(IReadOnlyList<>)));
    }

    [Fact]
    public void ImplementsGenericInterface_List_IsNotInvalidInterfaceTypes()
    {
        var list = new List<string>();
        Assert.False(list.GetType().ImplementsGenericInterface(typeof(string)));
        Assert.False(list.GetType().ImplementsGenericInterface(typeof(IDictionary<,>)));
        Assert.False(list.GetType().ImplementsGenericInterface(typeof(IComparable<>)));
        Assert.False(list.GetType().ImplementsGenericInterface(typeof(DateTime)));
    }

1

我正在使用以下代码:

public bool IsList(Type type) => IsGeneric(type) && (
            (type.GetGenericTypeDefinition() == typeof(List<>))
            || (type.GetGenericTypeDefinition() == typeof(IList<>))
            );

0

最好的方法可能是执行以下操作:

IList list = value as IList;

if (list != null)
{
    // use list in here
}

这将为您提供最大的灵活性,并且还允许您使用实现IList接口的许多不同类型。


3
这不会检查是否是要求的通用列表。
卢卡斯2009年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.