Мой контекст заключается в том, что я создаю простой фабричный метод для создания экземпляров производных типов данного базового типа.Фабричный метод принимает только параметр типа, т.е. не имеет аргументов.Это очевидно возможно с помощью конструкции if
- else if
:
public Vehicle Create<T>()
{
if (typeof(T) == typeof(Car))
return new Car(); // just an example; could be more complex logic.
else if (typeof(T) == typeof(Truck))
return new Truck(); // just an example; could be more complex logic.
else
throw new ArgumentException(
$"The type {typeof(T).Name} is not known by this method.");
}
На данный момент хорошо известно, как использовать сопоставление с образцом в C # (начиная с C # 7.0) для перехода на основе типа переменная , но это не работает для параметра типа:
switch (T) { ... } // error: "'T' is a type, which is not valid in the given context"
или ...
switch (typeof(T))
{
case Car c: ...
// err: "An expression of type 'Type' cannot be handled by a pattern of type 'Car'"
}
Так что я хотел бы знать если можно использовать switch
для достижения того же результата?
Исследование: Я удивлен, что об этом раньше не спрашивали, но я не могу его найти.Я нашел этот пост , в котором есть имя и несколько ответов, которые довольно близки, но он имеет дело с (числовыми) типами значений и методами, которые имеют аргумент типа T
- параметр универсального типа.Точно так же этот пост также использует аргумент.