2010-11-01 3 views
3

Je souhaite avoir un dictionnaire dans lequel les valeurs sont des objets génériques et ne seront pas identiques pour chaque valeur du dictionnaire. Comment cela peut-il être fait, j'ai l'impression qu'il me manque quelque chose de simple.Dictionnaire générique avec une valeur en tant qu'interface avec une référence générique

EG


    public interface IMyMainInterface 
    { 
     Dictionary<string, IMyInterface<T>> Parameters { get; } 
    } 

    public interface IMyInterface<T> 
    { 
     T Value 
     { 
      get; 
      set; 
     } 

     void SomeFunction(); 
    } 

Result: 
dic.Add("key1", new MyVal<string>()); 
dic.Add("key2", new MyVal<int>()); 

Répondre

8

Vous ne pouvez pas le faire parce que T n'a pas de sens dans IMyMainInterface. Si votre objectif est pour chaque valeur d'être une implémentation de certainsIMyInterface<T> mais chaque valeur pourrait être une mise en œuvre d'un autre T, alors vous devriez probablement déclarer une interface de base:

public interface IMyInterface 
{ 
    void SomeFunction(); 
} 

public interface IMyInterface<T> : IMyInterface 
{ 
    T Value { get; set; } 
} 

alors:

public interface IMyMainInterface 
{ 
    Dictionary<string, IMyInterface> Parameters { get; } 
} 

EDIT: Compte tenu de votre question mise à jour, il semble que c'est ce que vous essayez de faire. Si vous voulez savoir pourquoi vous devez faire cela, pensez à la façon dont vous voulez essayer utiliser les valeurs dans le dictionnaire si vous étiez en mesure d'utiliser votre code original. Imaginez:

var pair = dictionary.First(); 
var value = pair.Value; 

Qu'est-ce qui pourrait taper value être déduit que?


Si, cependant, chaque valeur doit être du même T, alors vous avez juste besoin de faire votre autre interface générique aussi. Pour le rendre plus clair, je l'ai renommé le paramètre de type pour garder les Ts séparés:

public interface IMyMainInterface<TFoo> 
{ 
    Dictionary<string, IMyInterface<TFoo>> Parameters { get; } 
} 
+0

Si je prends cette route, pour tirer la valeur à partir du dictionnaire que je dois jeter le type. c'est-à-dire MyDict ["clé"]. Value.Value (Oui mauvaise terminologie) – Sytone

+0

@Stone: Oui. C'est absolument nécessaire de toute façon - car sinon vous pourriez essayer de sortir la valeur de "key2" comme une chaîne au lieu d'un int ... comment le compilateur peut-il savoir ce que vous vouliez? –

Questions connexes