Nécessité d'avoir un de type sécurité sac d'articles qui mettent tous en œuvre une interface générique.Comment est-ce que je peux faire un type coffre-fort d'articles qui implémentent tous une interface générique?
Le désir est de faire quelque chose comme:
var stringItem = new IItem<string>();
var numberItem = new IItem<int>();
var items = new List<IItem<T>>(); //T of course doesn't accomplish what I want
items.Add(stringItem);
items.Add(numberItem);
Quelque chose comme:
interface IItem
{
object Value { get; set; }
}
//Update: 2009-03-19 03:08 PM MST
//Added the following interface for clarity of my question
interface IItem<T> : IItem
{
new T Value { get; set; }
}
Ensuite, je pouvais:
var items = new List<IItem>();
Mais, je perds la sécurité de type dans mon sac . Donc, je pensais Dictionary
:
var dict = new Dictionary<Type, List<IItem<T>>>(); //T is wrong again
dict.Add(typeof(string), new List<IItem<string>>); //that sure looks nice
Je sais qu'une solution plus élégante existe. Après tout, les génériques eux-mêmes ont été ajoutés à .NET. Peut-être que la dynamique dans C# 4.0 nous donnera un chemin plus clair vers cette réponse. Je suppose que nous ne sommes tout simplement pas assez intelligents pour comprendre la réponse de type sécurité aujourd'hui. :) –
Il pourrait être utile si vous avez décrit ce que vous avez l'intention de faire avec votre sac mélangé. –
Je vais avec l'héritage de l'interface générique object-vs-type-safe-generic. Pour mon sac, j'ai ajouté une requête LINQ soignée pour obtenir un sous-ensemble d'éléments spécifiques au type: public IEnumerable> GetItems () {Type t = typeof (T); return (IEnumerable >) Items.Where (i => i.Value.GetType() == t); } –