IList предназначен для хранения одного типа. Чтобы решить, является ли что-то «единственным типом» или нет, вам нужно развернуть все параметры типа. Если взять ваш пример IList<Item<T>>
, то T
должен быть одним-единственным для конкретного экземпляра.
Например, вы можете выбрать Animal
для T
, а затем перейти к помещению Dog
, Cat
и Bear
в IList
. Но вы не можете поместить туда произвольные типы; они должны быть в состоянии быть преобразованы в тип, который вы указываете для T
. И если ваши типы и не связаны таким образом, у вас нет другого выбора, кроме как иметь неуниверсальный интерфейс для вашего списка. Вы также можете рассмотреть возможность определения типа интерфейса для T, которому могут соответствовать все ваши соответствующие критериям элементы.
Как только вы определились, что будет T
, вы можете сделать свой метод общим:
public void PrintItems<T>(IList<Item<T>> list)
{
// ...
}