Если объект является общим списком

Можно ли определить, является ли объект общим списком? Я не буду знать тип списка, я просто знаю его список. Как я могу это определить?

Ответ 1

Это вернет "True"

List<int> myList = new List<int>();

Console.Write(myList.GetType().IsGenericType && myList is IEnumerable);

Вам интересно узнать, действительно ли это "Список"... или вы в порядке с IEnumerable и Generic?

Ответ 2

Следующий метод вернет тип элемента общего типа коллекции. Если тип не реализует ICollection < > , то возвращается null.

static Type GetGenericCollectionItemType(Type type)
{
    if (type.IsGenericType)
    {
        var args = type.GetGenericArguments();
        if (args.Length == 1 &&
            typeof(ICollection<>).MakeGenericType(args).IsAssignableFrom(type))
        {
            return args[0];
        }
    }
    return null;
}

Изменить: Вышеупомянутое решение предполагает, что указанный тип имеет собственный общий параметр. Это не будет работать для типов, которые реализуют ICollection < > с жестким кодированным общим параметром, например:

class PersonCollection : List<Person> {}

Вот новая реализация, которая будет обрабатывать этот случай.

static Type GetGenericCollectionItemType(Type type)
{
    return type.GetInterfaces()
        .Where(face => face.IsGenericType &&
                       face.GetGenericTypeDefinition() == typeof(ICollection<>))
        .Select(face => face.GetGenericArguments()[0])
        .FirstOrDefault();
}

Ответ 3

Try:

if(yourList.GetType().IsGenericType)
{
  var genericTypeParams = yourList.GetType().GetGenericArguments;
  //do something interesting with the types..
}

Ответ 4

Принятый ответ не гарантирует тип IList < > . Проверьте эту версию, она работает для меня:

private static bool IsList(object value)
{
    var type = value.GetType();
    var targetType = typeof (IList<>);
    return type.GetInterfaces().Any(i => i.IsGenericType 
                                      && i.GetGenericTypeDefinition() == targetType);
}

Ответ 5

Вопрос неоднозначен.

Ответ зависит от того, что вы подразумеваете под общим списком.

  • A List <SomeType>

  • Класс, который происходит из List <SomeType>

  • Класс, реализующий IList <SomeType> (в этом случае массив можно рассматривать как общий список - например, int [] реализует IList <int> )?

  • Класс, который является общим и реализует IEnumerable (это тест, предложенный в принятом ответе)? Но это будет также рассматривать следующий скорее патологический класс как общий список:

.

public class MyClass<T> : IEnumerable
{
    IEnumerator IEnumerable.GetEnumerator()
    {
        return null;
    }
}

Лучшее решение (например, использовать ли GetType, IsAssignableFrom и т.д.) будет зависеть от того, что вы имеете в виду.

Ответ 6

Функция GetType() в классе System.Object. Вы пробовали это?