Método genérico con múltiples restricciones.

251

Tengo un método genérico que tiene dos parámetros genéricos. Traté de compilar el siguiente código pero no funciona. ¿Es una limitación de .NET? ¿Es posible tener múltiples restricciones para diferentes parámetros?

public TResponse Call<TResponse, TRequest>(TRequest request)
  where TRequest : MyClass, TResponse : MyOtherClass
Martín
fuente

Respuestas:

402

Es posible hacer esto, solo tiene la sintaxis ligeramente incorrecta. Necesita un wherepara cada restricción en lugar de separarlos con una coma:

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

Además de la respuesta principal de @LukeH con otro uso, podemos usar múltiples interfaces en lugar de la clase. (Una clase y n interfaces de conteo) como este

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

o

public TResponse Call<TResponse, TRequest>(TRequest request)
  where TRequest : IMyClass,IMyOtherClass
Hamit YILDIRIM
fuente
1

Además de la respuesta principal de @LukeH, tengo un problema con la inyección de dependencia, y me tomó un tiempo solucionarlo. Vale la pena compartir, para aquellos que enfrentan el mismo problema:

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

Se resuelve de esta manera. en contenedores / servicios la clave es typeof y la coma (,)

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

Esto fue mencionado en esta respuesta .

maytham-ɯɐɥʇʎɐɯ
fuente
2
Esta respuesta no está relacionada con las restricciones de tipo en absoluto. Se trata de tipos genéricos independientes y cómo deletrearlos en C #. stackoverflow.com/a/2173115/2157640 stackoverflow.com/a/6607299/2157640
Palec