Общий метод с несколькими ограничениями

У меня есть общий метод с двумя универсальными параметрами. Я попытался скомпилировать приведенный ниже код, но он не работает. Это ограничение .NET? Возможно ли иметь несколько ограничений для разных параметров?

public TResponse Call<TResponse, TRequest>(TRequest request)
  where TRequest : MyClass, TResponse : MyOtherClass

Ответов (4)

Решение

Это возможно, просто у вас немного неправильный синтаксис. Вам нужно whereдля каждого ограничения, а не разделять их запятой:

public TResponse Call<TResponse, TRequest>(TRequest request)
    where TRequest : MyClass
    where TResponse : MyOtherClass

В дополнение к основному ответу @LukeH у меня проблема с внедрением зависимостей, и мне потребовалось некоторое время, чтобы исправить это. Тем, кто сталкивается с подобной проблемой, стоит поделиться:

public interface IBaseSupervisor<TEntity, TViewModel> 
    where TEntity : class
    where TViewModel : class

Решается это так. в контейнерах / сервисах ключ - это typeof и запятая (,)

services.AddScoped(typeof(IBaseSupervisor<,>), typeof(BaseSupervisor<,>));

Об этом упоминалось в этом ответе .

В дополнение к основному ответу @LukeH с другим использованием мы можем использовать несколько интерфейсов вместо класса. (Один класс и n интерфейсов счетчика), как это

public TResponse Call<TResponse, TRequest>(TRequest request)
  where TRequest : MyClass, IMyOtherClass, IMyAnotherClass

или

public TResponse Call<TResponse, TRequest>(TRequest request)
  where TRequest : IMyClass,IMyOtherClass

Каждое ограничение должно быть в отдельной строке, и если их больше для одного универсального параметра, их нужно разделить запятой.

public TResponse Call<TResponse, TRequest>(TRequest request)
    where TRequest : MyClass, 
    where TResponse : MyOtherClass, IOtherClass