如何制作一个所有实现通用界面的类型安全包?

Eri*_*son 2 .net generics

需要一个类型安全的项目包,所有项目都实现了通用接口.

希望做的事情如下:

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);
Run Code Online (Sandbox Code Playgroud)

就像是:

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; }
}
Run Code Online (Sandbox Code Playgroud)

然后,我可以:

var items = new List<IItem>();
Run Code Online (Sandbox Code Playgroud)

但是,我的包里丢失了安全性.所以,我想到了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
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 5

我认为你不能逃避这个IItem<int>IItem<string>不同的事实; 通常的方法是基础接口:

interface IItem {
   object Value {get;}
}
interface IItem<T> : IItem {
   new T Value {get;}
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以编写代码IItem,但实际的实例(通常IItem<T>为某些实例实现T)在内部是强类型的.