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


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

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<,>));

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


2
Этот ответ не связан с типовыми ограничениями вообще. Речь идет о несвязанных универсальных типах и о том, как их прописать в C #. stackoverflow.com/a/2173115/2157640 stackoverflow.com/a/6607299/2157640
Палек,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.