IList在接口中,List在实现中

本文关键字:实现 List IList 接口 | 更新日期: 2023-09-27 18:24:47

在我的接口中,通常有一个IList<ISomeType>来表示List类型的成员并且我期望一种支持CCD_ 2方法的实现。

但是在接口实现中,有一个

IList<ISomeType> = new List<ISomeType>()

每次我使用列表时,我都必须进行投射,例如

(this.MyList as List<IMyType>).AddRange(someType.ToList());

有更好的方法吗?如何避免这种铸造?

-编辑以询问更多信息-

有没有一个小的linq表达式来解决这个问题,而不是一个扩展方法?

IList<string> list = new List<string>();
var items = new[] { "1", "2", "3" };
items.ToList().ForEach(x => list.Add(x));

但这看起来并不是很直接,因为它颠倒了正在做的事情。(操作针对要添加的项目,而不是列表)。

还有比这更好的吗?清单上可能有什么可以做的?

IList在接口中,List在实现中

AddRange不是IList上的方法,但是Add是,所以您可以很容易地创建一个扩展方法:

public static void AddRange<T>(this IList<T> list, IEnumerable<T> values) {
    foreach(var value in values)
        list.Add(value);
}

您也可以在扩展方法中检查list是否实际上是list的一个实例,在这种情况下,您可以直接调用AddRange

可以制作Martin建议的扩展方法,但这可能会破坏内容。

为什么人们使用界面?表达公共合同。现在这个合同是在.NET BCL框架中。如果您将代码公开给外部,您还必须公开扩展方法,并确保人们将using语句添加到扩展所在的文件中。这可能会导致编译时错误(类似于"IList<T>中没有可用的AddRange方法")。

此外,扩展方法制动了Liskov替换原理(用基类型替换超类型)。

因此,如果在方法中只使用List<T>,则可以很容易地将IList<T>更改为List<T>