2010-07-01 7 views
1

Dire que j'ai cette interface:La meilleure façon de maintenir les références à une collection de types génériques

public interface IRepository<T> where T : Entity 
{ 
    T Get(string query); 
    void Save(T entity); 
} 

et moi avons deux classes concrètes comme (où l'utilisateur et le projet, bien sûr, hériteront de l'entité):

public class UserRepository : IRepository<User> { ... } 
public class ProjectRepository : IProjectRepository<Project> { ... } 

Quelle est la meilleure façon de conserver une référence à tous ceux d'une même collection? Manifestement, vous ne pouvez pas avoir quelque chose comme:

var repos = new IRepository<Entity>[] 
{ 
    new UserRepository(), 
    new ProjectRepository() 
} 

Alors doit j'ai une interface non-générique à partir de laquelle l'interface générique hérite?

public interface IRepository 
{ 
    Entity Get(string query); 
    void Save(Entity entity); 
} 

public interface IRepository<T> : IRepository { ... } 

Merci pour toute aide, des idées, des suggestions.

Répondre

2

Votre interface de IRepository<T> ne se prête pas vraiment à co- ou contre-variance, puisque T apparaît dans les deux entrée et positions sortie. Le mieux que vous pouvez vraiment faire ici est de fournir une interface non générique comme vous le signalez.

Vous pouvez, bien sûr, stocker des références à n'importe quel type en utilisant object - mais je suppose que vous cherchez quelque chose de plus sécurisé que ça.

+0

Oui, je traitais tout cela dans une collection d'objets et oui, je voulais un moyen plus sûr de type. – xanadont

+0

Aussi, heureux je l'ai demandé, je vais devoir lire sur les implications de ISomeInterface : http://blog.tlk.com/dot-net/2009/c-sharp-4-covariance-and-contravariance Merci pour le allusion. – xanadont

1

Donc dois-je avoir une interface non générique dont hérite l'interface générique?

Oui. Vous pouvez mettre moins de méthodes sur cette interface non générique, si vous pouvez vous en sortir: cela dépend du type de casting que vous voulez faire. (Vous pouvez les mettre dans un object[], par exemple.)

Questions connexes