ICollection <t>没有AddRange但是List <t>没有,但是Casting Bad

时间:2015-07-09 20:25:56

标签: c#

所以在我班上我有这个私人只读成员ICollection<IMusicItem> playlist。我更喜欢使用界面ICollection<T>

我想使用List<T>.AddRange(IEnumerable<T> items)。在我的方法中,即使我在构造函数中将ICollection实例化为List<T>,也会将ICollection<T>强制转换为new List<T>()

这是不好的做法,有没有更好的方法呢?

或者只是拥有List<T>

会更好

2 个答案:

答案 0 :(得分:6)

这是不好的做法,因为它破坏了封装。使用接口是好的,但是如果必须将对象强制转换为具体类型则没有意义。就好像你不知道具体的类型一样,或者如果你决定稍后再切换到另一种类型,这就是未来的错误。

请改用扩展方法:

public static void AddRange<T>(this ICollection<T> collection, IEnumerable<T> items)
{
    foreach (var item in items)
        collection.Add(item);
}

注意:最好在公共API中公开接口,以便以后可以随意更改实现对象,但是在私有字段上是否可以进行样式处理。你也可以使用具体的课程。

答案 1 :(得分:3)

这不是危险的(当做得对时),毫无意义。

if (playlist is IList<IMusicItem>)
{
  (playList as IList<IMusicItem>).AddRange(items);
} 
else
{
   // still need a foreach here
}

真正的问题是“我更愿意使用界面ICollection<T>”。

为什么到底?你的问题表明它总是一个List,所以为什么不公开它?

将其公开为更一般的ICollection<>只有在可能存在除List之外的其他实现时才有意义,然后转换是无用的。