在C#中创建通用对象的通用列表

时间:2014-07-24 20:30:43

标签: c#

我有一个泛型类,我想创建一个通用列表,其中底层类实现相同的接口。但是,并非所有实现给定的接口。

一个例子比描述问题容易。

internal interface ISomething
{

}

internal class ThisThing : ISomething
{
}

internal class ThatThing : ISomething
{

}

internal class SomethingElse 
{

}

internal class GenericThing<T> 
{

}

internal class DoThings
{
    void Main()
    {
        var thing1 = new GenericThing<ThisThing>();
        var thing2 = new GenericThing<ThatThing>();

        var thing3 = new GenericThing<SomethingElse>();

        **var thingList = new List<GenericThing<ISomething>>() {thing1, thing2};**
    }

}

我无法创建thingList。有没有办法将实现相同接口的两个东西转换为泛型集合,同时仍然保留GenericThing类不受约束到接口。

1 个答案:

答案 0 :(得分:4)

如果您使用covariant interface

,则可以这样做
internal interface IGenericThing<out T>
{
}

internal class GenericThing<T> : IGenericThing<T>
{
}

void Main()
{
    var thing1 = new GenericThing<ThisThing>();
    var thing2 = new GenericThing<ThatThing>();

    var thing3 = new GenericThing<SomethingElse>();

    var thingList = new List<IGenericThing<ISomething>>() {thing1, thing2};
}

请注意,仅当T仅用作IGenericThing<T>中的输出时才可以执行此操作,而不是作为输入! (它在我的例子中没用,也是允许的;虽然,显然,没用)