2010-05-20 3 views
2

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?

+0

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? –

+0

Ouch, bon appel. Dommage que je ne puisse pas accepter un commentaire comme réponse: P – John

+0

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. :) –

Répondre

3

Non; vous ne pouvez pas contraindre un paramètre générique à l'un des types multiples. Les contraintes génériques sont des constructions assez simples, en fait.

Et je pense que vous pourriez bientôt rencontrer le fait que les contraintes génériques ne participent pas à la résolution de surcharge. :(

0

La réponse la plus courte est:.. Pas

Une réponse plus est que vous pouvez limiter, comme vous l'avez fait, à une classe de base commune ou de l'interface Mais dans le cas d'int et string, la base commune class of int et string est Object, ce qui n'est évidemment pas une contrainte intéressante (ni légale si je me souviens bien)

Vous pouvez restreindre un paramètre générique à une classe ou une structure, mais encore une fois, cela ne correspond pas à vos besoins.

Je suppose que vous êtes limité à vérifier au moment de l'exécution si le type est légal