需要一个类型安全的项目包,所有项目都实现了通用接口.
希望做的事情如下:
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)
我认为你不能逃避这个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)在内部是强类型的.