List<T> Foo<T>(Ilist list)
where T : ??
есть ли любой способ осуществить T, чтобы быть
один из немногих классов?
в конечном счете я хочу сделать переключатель на T..
спасибо.
Применение ограничения типа таким образом указывает, что эти несколько классов связаны с общей функциональностью.
Вы должны реализовать общий интерфейс, а затем ограничить тип этим интерфейсом:
public interface IUseful
{
public void UsefulMethod();
}
List<T> Foo<T>(IList list) where T : IUseful
{
// You now have access to all common functionality defined in IUseful
}
Дополнительным преимуществом является то, что теперь вам не нужно включать T
, чтобы реализовать другое поведение. Вы можете попросить потомков IUseful
реализовать свое собственное поведение, а затем вызывать каждого по отдельности.
Вы можете потребовать, чтобы каждый класс, который вы хотите включить в свой список, реализовывал некоторый интерфейс ISomething
, а затем создавал List
.
в конце концов я хочу переключить T ..
Вместо переключения типа объекта было бы лучше иметь метод в вашем интерфейсе и реализовывать его по-разному для каждого класса.
Насколько я знаю, это невозможно. Я бы рекомендовал заимствовать ваш ограниченный набор классов из общего базового класса или интерфейса.
В этом случае T может быть общим базовым классом или интерфейсом, который вы перечисляете для общих объектов. У вас может быть List
, и список может содержать классы Foo, Bar и Baz
, если каждый из них реализует интерфейс IFoo
. Если не использовать наследование, вы бы застряли со списком объектов.
Что вам нужно? После двоеточия вы можете перечислить типы, на которые вы накладываете ограничения T
.
Для нескольких классов, возможно, достаточно реализовать один общий интерфейс и установить на него ограничение.
Более подробную информацию можно найти по этой ссылке: Ограничения на параметры типа (Руководство по программированию на C#)