在C#中,将ICollection <x>转换为ICollection <y>的正确方法是什么?</y> </x>

时间:2012-12-17 13:11:09

标签: c# .net interface

例如:

public interface IFoo
{
    //...

    ICollection<IFoo> Children { get; }

    //...
}

public class Foo : IFoo
{
    //...

    public ICollection<Foo> Children { get; private set; }

    //...

    public ICollection<IFoo> IFoo.Children
    {
        get
        {
            return Children; // Obviously wrong datatype, how do I cast this?
        }
    }

    //...
}

那我该如何正确实施IFoo.Children?我尝试了Children.Cast<IFoo>,但这会返回IEnumerable<IFoo>

2 个答案:

答案 0 :(得分:5)

你需要考虑一下。如果这个强制转换可以工作,那么代码将被允许为你的集合添加一个完全不同的类对象,一个实现IFoo,但与Foo完全无关。您的收藏品现在将不再是Foo的集合。那当然是不允许的。 IEnumerable的&LT;&GT;很好,不能改变收藏。的ICollection&LT;&GT;不是。

获得所需内容的唯一可能方法是创建集合的副本。像List<IFoo>一样。你当然会为此支付费用。并且不能轻易看到该列表的更改,这是可修复的。但是你仍然有一个根本问题,即修改该列表的客户端代码仍然允许添加或删除你不知道如何处理的对象。

答案 1 :(得分:3)

尝试Children.Cast<IFoo>().ToList()