小编Khr*_*nos的帖子

在c#中返回集合时如何处理协方差?

我有回收收集和协方差的问题,我想知道是否有人有更好的解决方案.

场景是这样的:

我有2个版本的实现,我想保持版本实现完全分离(即使它们可能具有相同的逻辑).在实现中,我想返回一个项目列表,因此在界面中,我将返回该项目的接口列表.但是,在实际的接口实现中,我想返回该项的具体对象.在代码中,它看起来像这样.

interface IItem
{
    // some properties here
}

interface IResult
{
    IList<IItem> Items { get; }
}
Run Code Online (Sandbox Code Playgroud)

然后,将有2个名称空间具有这些接口的具体实现.例如,

命名空间版本1

class Item : IItem

class Result : IResult
{
    public List<Item> Items
    {
        get { // get the list from somewhere }
    }

    IList<IItem> IResult.Items
    {
        get
        {
            // due to covariance, i have to convert it
            return this.Items.ToList<IItem>();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在命名空间Version2下会有另一个相同的实现.

要创建这些对象,将有一个工厂接受版本并根据需要创建适当的具体类型.

如果调用者知道确切的版本并执行以下操作,则代码可以正常工作

Version1.Result result = new Version1.Result();
result.Items.Add(//something);
Run Code Online (Sandbox Code Playgroud)

但是,我希望用户能够做到这样的事情.

IResult result = // create from …
Run Code Online (Sandbox Code Playgroud)

c# implementation interface covariance

9
推荐指数
1
解决办法
233
查看次数

标签 统计

c# ×1

covariance ×1

implementation ×1

interface ×1