IList in interface,List in implementation

Mar*_*tus 2 c# abstraction interface list

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

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

IList<ISomeType> = new List<ISomeType>()
Run Code Online (Sandbox Code Playgroud)

例如,每当我使用List时,我都必须进行转换

(this.MyList as List<IMyType>).AddRange(someType.ToList());
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?如何避免这种演员?

- 编辑以询问更多信息 -

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

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

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

有什么比这更好的?可以在列表上做些什么?

Mar*_*nst 5

AddRange不是IList上的方法,但是Add is,因此您可以轻松地创建扩展方法:

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

您还可以在扩展方法中检查列表是否实际上是List的实例,在这种情况下,您可以直接调用AddRange