将具体类型的ICollection转换为具体类型接口的ICollection

时间:2016-01-18 15:00:01

标签: c# .net interface icollection

ICollection<Bar>实施ICollection<IBar>的地方Bar IBar的推荐方式是什么?

是否像

一样简单
collection = new List<Bar>();
ICollection<IBar> = collection as ICollection<IBar>?

还是有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

您必须投射列表中的每个项目并创建一个新项目,例如使用Cast

ICollection<IBar> ibarColl = collection.Cast<IBar>().ToList();

在.NET 4中,使用IEnumerable<T>

的协方差
ICollection<IBar> ibarColl = collection.ToList<IBar>();

List.ConvertAll

ICollection<IBar> ibarColl = collection.ConvertAll(b => (IBar)b);

后者可能会更有效率,因为它事先知道大小。

答案 1 :(得分:2)

您无法转发ICollection<IBar>,但可以转为IEnumerable<IBar>

因此,如果您不打算在列表中添加内容,则可以执行以下操作:

IEnumerable<IBar> enumeration = (IEnumerable<IBar>)collection;

来自其他答案的解决方案实际上并未实施,但会创建一个新列表,不会反映原始列表的后续更改。

答案 2 :(得分:0)

只需使用

转换所有条目
ICollection<IBar> ibars = collection.ConvertAll(bar => (IBar)bar);

我认为这个变体也是可读的。也许有方法可以用更高的性能来施展它......