Méthode générique à contraintes multiples


251

J'ai une méthode générique qui a deux paramètres génériques. J'ai essayé de compiler le code ci-dessous mais cela ne fonctionne pas. S'agit-il d'une limitation .NET? Est-il possible d'avoir plusieurs contraintes pour différents paramètres?

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

Réponses:


402

Il est possible de le faire, vous avez juste une syntaxe légèrement erronée. Vous avez besoin d'un wherepour chaque contrainte plutôt que de les séparer par une virgule:

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

8

En plus de la réponse principale de @LukeH avec une autre utilisation, nous pouvons utiliser plusieurs interfaces au lieu de la classe. (Une classe et n interfaces de comptage) comme ceci

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

En plus de la réponse principale de @LukeH, j'ai un problème avec l'injection de dépendance, et cela m'a pris un certain temps pour résoudre ce problème. Il vaut la peine de partager, pour ceux qui sont confrontés au même problème:

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

C'est résolu de cette façon. dans les conteneurs / services, la clé est typeof et la virgule (,)

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

Cela a été mentionné dans cette réponse .


2
Cette réponse n'est pas du tout liée aux contraintes de type. Il s'agit de types génériques non liés et de la façon de les épeler en C #. stackoverflow.com/a/2173115/2157640 stackoverflow.com/a/6607299/2157640
Palec
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.