J'ai une application avec beaucoup de génériques et IoC. J'ai une interface comme ceci:C# Contraintes multiples
public interface IRepository<TType, TKeyType> : IRepo
J'ai un tas de tests pour mes différentes implémentations de IRepository. Beaucoup d'objets ont des dépendances sur d'autres objets, donc pour tester, je veux en saisir un qui soit valide. Je peux définir une méthode distincte pour chacun d'eux:
public static EmailType GetEmailType()
{
return ContainerManager.Container.Resolve<IEmailTypeRepository>().GetList().FirstOrDefault();
}
Mais je veux que ce soit générique de sorte qu'il peut par utilisé pour obtenir un objet à partir du référentiel, il fonctionne avec. J'ai défini ceci:
public static R GetItem<T, R>() where T : IRepository<R, int>
{
return ContainerManager.Container.Resolve<T>().GetList().FirstOrDefault();
}
Cela fonctionne très bien pour les implémentations qui utilisent un entier pour la clé. Mais j'ai aussi des dépôts qui utilisent la chaîne. Donc, je le fais maintenant:
public static R GetItem<T, R, W>() where T : IRepository<R, W>
Cela fonctionne très bien. Mais je voudrais restreindre 'W' à int ou string. Y-a-t-il un moyen de faire ça? La question la plus courte est, puis-je contraindre un paramètre générique à l'un de plusieurs types?
Pourquoi avez-vous besoin de restreindre W? Cela ne sera-t-il pas implicitement restreint par le fait que vous n'avez pas d'implémentation IRepository avec un W qui n'est ni int ni string? –
Ouch, bon appel. Dommage que je ne puisse pas accepter un commentaire comme réponse: P – John
Eh bien, votre vraie question était de savoir si vous pouviez contraindre un paramètre générique à l'un de plusieurs types et c'est toujours une question valide et intéressante. Le fait que vous n'ayez pas à vous soucier de la réponse n'est qu'un bonus. :) –