2

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

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

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));

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

还有什么比这更好的吗?可能的事情可以在列表中完成?

4

2 回答 2

5

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

于 2013-07-25T09:29:47.420 回答
0

可以制作 Martin 建议的扩展方法,但这可能会破坏一些东西。

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

此外,扩展方法阻碍了Liskov 替换原则(用基本类型替换超类型)。

所以如果你只List<T>在方法中使用,你可以很容易地更改IList<T>List<T>.

于 2013-07-25T09:43:42.137 回答