Загальний метод з множинними обмеженнями


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
Palec
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.