.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(); }
}