如何在 C# 中对开放类型进行泛型多态性?



我有一个这样的接口:

interface IFoo<in T> {
...
}

我想拥有一个这些类的集合,而无需为所有集合元素强制使用特定的泛型参数,例如:

class IFooCollection {
List<IFoo<?>> _items;
public IFooCollection(List<IFoo<?>> items)
{
_items = items;
}
...
}

由于您不想强制使用特定类型,因此请按以下方式创建abstract classinterface

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 中的"开放泛型类型"到底是什么?

泛型 - 开放和封闭构造类型

最新更新