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

251

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

public TResponse Call<TResponse, TRequest>(TRequest request)
  where TRequest : MyClass, TResponse : MyOtherClass
Мартин
источник

Ответы:

402

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

public TResponse Call<TResponse, TRequest>(TRequest request)
    where TRequest : MyClass
    where TResponse : MyOtherClass
LukeH
источник
8

В дополнение к основному ответу @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
Хамит ЙИЛДИРИМ
источник
1

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

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

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

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

Это было упомянуто в этом ответе .

maytham-ɯɐɥʇʎɐɯ
источник
2
Этот ответ не связан с типовыми ограничениями вообще. Речь идет о несвязанных универсальных типах и о том, как их прописать в C #. stackoverflow.com/a/2173115/2157640 stackoverflow.com/a/6607299/2157640
Палек,