2009-09-19 7 views
1

J'ai un type de base à partir duquel 3 objets différents sont hérités. Appelons l'objet de base B et les objets hérités X, Y et Z. Maintenant j'ai des dictionnaires avec un int comme clé et respectivement X, Y, Z comme valeur.Polymorphisme avec les dictionnaires

J'ai un contrôle qui devra faire des recherches dans un et un seul des dictionnaires spécifiques pour se dessiner mais pour pouvoir travailler avec mes trois dictionnaires j'ai essayé de spécifier que le contrôle devrait prendre un argument égal à Dictionary<int, B>. Cela n'a pas fonctionné cependant.

Alors, quelles sont mes options? Je veux que mon contrôle fonctionne avec tous les dictionnaires de la forme <int, B>.

Répondre

7

Faire une méthode générique comme ceci:

public void DoSomething<T>(IDictionary<int, T> dictionary) where T : B 

Ou De même que le contrôle lui-même générique (qui donnera à vos questions de designer, mais ...)

public class MyControl<T> where T : B 
{ 
    private IDictionary<int, T> dictionary; 
    ... 
} 

Vous devez faire en raison de l'invariance générique. Même en C# 4 (qui prend en charge une certaine variance) ce serait invariant: un dictionnaire utilise les valeurs des deux entrées et. Imaginez que vous pouvez convertir de Dictionary<int, X> à Dictionary<int, B>. Vous seriez alors en mesure d'écrire:

dictionary[0] = new B(); 

... qui ne serait manifestement pas valable pour le dictionnaire, car il est pas X ...

+1

Note: Cette dernière option est viable lorsque Le contrôle prend l'un des trois types spécifiques tout au long de sa durée de vie. La première option vous permet de changer de type selon vos besoins. – Joren

+0

A travaillé comme un charme! Je ne peux pas croire à quel point j'ai raté ça. J'ai ajouté à la définition de classe avec où T: B puis dans le constructeur j'ai pris un objet Dictionary . Réponse géniale. Le contrôle n'a pas besoin de varier quel type est utilisé. Chaque contrôle n'en utilise qu'un pour toute une vie. –

Questions connexes