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));
但这看起来并不是很直接,因为它颠倒了正在做的事情。(操作针对要添加的项目,而不是列表)。
还有比这更好的吗?清单上可能有什么可以做的?
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>
。