Вход на сайт
C# - вернуть типизированную коллекцию
1698 просмотров
Перейти к просмотру всей ветки
Последний раз изменено 04.04.24 10:21 (alex445)
Есть система классов
class Base
class Derived1 : Base
class Derived2 : Base
Есть коллеции объектов наследованных классов
List<Derived1> Derived1Collection List<Derived2> Derived2Collection
Хочу дженерик метод для класса, где хранятся эти коллекции, который вернёт любую из этих коллекций. Типа такого
GetData<Derived1>();
Сделал так
public static IEnumerable<T> GetData<T>() where T : Base => typeof(T) switch { _ when typeof(T) == typeof(Derived1) => Derived1Collection.Cast<T>(), _ when typeof(T) == typeof(Derived2) => Derived2Collection.Cast<T>(), _ => throw new Exception($"{typeof(T)} is not supported."), };
Ошибок компиляции не показывает, но ещё не юзал.
Мне не нравится - некрасиво. Лишняя хреть typeof(T) перед свичом. И зачем-то требует Cast, а без него пишет
Cannot implicitly convert type List<Derived1> to IEnumerable<T>
Что за глупость? Не может сконверить более унаследованный класс в менее унаследованный? Причём менее унаследованный что для коллекции, что для типа коллекции - Derived1 кастуется в Base, List кастуется в IEnumerable - у нас же ковариация тут работает для IEnumerable .