Método genérico com várias restrições


251

Eu tenho um método genérico que tem dois parâmetros genéricos. Tentei compilar o código abaixo, mas ele não funciona. É uma limitação do .NET? É possível ter várias restrições para parâmetros diferentes?

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

Respostas:


402

É possível fazer isso, você acabou de entender a sintaxe um pouco errada. Você precisa de um wherepara cada restrição, em vez de separá-los com uma vírgula:

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

8

Além da resposta principal de @LukeH com outro uso, podemos usar várias interfaces em vez de classe. (Uma classe e uma contagem de interfaces) como esta

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

ou

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

1

Além da resposta principal de @LukeH, tenho um problema com a injeção de dependência e demorei algum tempo para corrigir isso. Vale a pena compartilhar, para quem enfrenta o mesmo problema:

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

É resolvido desta maneira. em contêineres / serviços, a chave é typeof e a vírgula (,)

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

Isso foi mencionado nesta resposta .


2
Esta resposta não está relacionada a restrições de tipo. Trata-se de tipos genéricos não acoplados e como explicá-los em C #. stackoverflow.com/a/2173115/2157640 stackoverflow.com/a/6607299/2157640
Palec
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.