.NET: Как проверить тип внутри типичного типизированного класса?

Как мне получить тип типичного типизированного класса внутри класса?

Пример:

Я создаю обобщенную типизированную коллекцию, реализующую ICollection < Т > . У меня есть методы вроде

    public void Add(T item){
        ...
    }

    public void Add(IEnumerable<T> enumItems){
        ...
    }

Как я могу спросить в методе для данного типа T?

Причина моего вопроса: если объект используется как T, в коллекции используется Add (объект объекта) вместо Add (IEnumerable <object> enumItems), даже если параметр IEnumerable. Таким образом, в первом случае он добавит всю перечислимую коллекцию как один объект вместо нескольких объектов перечислимой коллекции.

Мне нужно что-то вроде

if (T is object) {
    // Check for IEnumerable
}

но, конечно, не может работать на С#. Предложения?

Большое спасибо!

Майкл

Ответы

Ответ 1

Лично я бы поставил вопрос, переименовав метод IEnumerable<T> в AddRange. Это позволяет избежать таких проблем и согласуется с существующими API, такими как List<T>.AddRange.

Он также сохраняет чистоту, когда T вы хотите добавить инструменты IEnumerable<T> (редко, я соглашусь).

Ответ 2

Вы можете использовать: typeof(T)

if (typeof(T) == typeof(object) ) {
    // Check for IEnumerable
}

Ответ 3

Если вы хотите использовать оператор is в общем классе/методе, вам нужно ограничить T ссылочным типом:

public void MyMethod<T>(T theItem) where T : class
{
    if (theItem is IEnumerable) { DoStuff(); }
}