我有一个这样的接口:
interface IFoo<in T> {
...
}
我想拥有一个这些类的集合,而无需为所有集合元素强制使用特定的泛型参数,例如:
class IFooCollection {
List<IFoo<?>> _items;
public IFooCollection(List<IFoo<?>> items)
{
_items = items;
}
...
}
由于您不想强制使用特定类型,因此请按以下方式创建abstract class
或interface
:
interface IFoo { }
并在特定于类型的Foo(使用泛型参数(中继承它,例如:
interface IFoo<T> : IFoo {}
这样,您只需List<IFoo>
并添加IFoo<T>
即可。
更多示例:
class FooCollection {
private List<IFoo> _collection;
public FooCollection()
{
_collection = new List<IFoo>();
}
public void Add(IFoo foo)
{
_collection.Add(foo);
}
public void Remove(IFoo foo)
{
_collection.Remove(foo);
}
}
如@IvMisticos所示,为了能够在开放类型上进行伪泛型多态性,您可以编写:
interface IFoo
{
}
interface IFoo<in T> : IFoo
{
}
class FooCollection
{
List<IFoo> _items;
public FooCollection(List<IFoo> items)
{
_items = items;
}
}
var item1 = some instance of IFoo<int>;
var item2 = some instance of IFoo<double>;
var item3 = some instance of IFoo<string>;
var list = new List<IFoo> { item1, item2, item3 };
var col = new FooCollection(list);
由于没有菱形运算符<>
允许在 C# 中的开放类型上进行真正的泛型多态性,因此据我所知,这是您唯一可以做的事情。
我真的很不喜欢这个闻起来很糟糕的黑客。
.NET 中的"开放泛型类型"到底是什么?
泛型 - 开放和封闭构造类型