Как проверить, является ли данное значение общим списком? - PullRequest
65 голосов
/ 27 апреля 2009
public bool IsList(object value)
    {
        Type type = value.GetType();
        // Check if type is a generic list of any type
    }

Какой лучший способ проверить, является ли данный объект списком или может быть приведен к списку?

Ответы [ 8 ]

96 голосов
/ 27 апреля 2009

Для вас, ребята, которые любят использовать методы расширения:

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

Итак, мы могли бы сделать:

if(o.IsGenericList())
{
 //...
}
71 голосов
/ 27 апреля 2009
if(value is IList && value.GetType().IsGenericType) {

}
12 голосов
/ 27 апреля 2009
 bool isList = o.GetType().IsGenericType 
                && o.GetType().GetGenericTypeDefinition() == typeof(IList<>));
6 голосов
/ 27 апреля 2009
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 голосов
/ 27 апреля 2009
if(value is IList && value.GetType().GetGenericArguments().Length > 0)
{

}
2 голосов
/ 15 августа 2018

Вот реализация, которая работает в .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)));
    }
2 голосов
/ 17 января 2017

Основываясь на ответе Виктора Родригеса, мы можем разработать другой метод для генериков. Фактически исходное решение можно сократить до двух строк:

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>);
}
1 голос
/ 27 апреля 2009

Вероятно, лучшим способом было бы сделать что-то вроде этого:

IList list = value as IList;

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

Это даст вам максимальную гибкость, а также позволит вам работать со многими различными типами, которые реализуют интерфейс IList.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...