添加接口集合到接口

时间:2012-11-02 11:25:12

标签: c# interface icollection

我试图绕过界面。我一直在磕磕绊绊这样的事情:

public interface IFoo
{
    ICollection<IBar> Bars { get; set; }
    //some other properties
}
public interface IBar
{
    //some properties
}
//assume Bar is implemented and extends IBar. Some instaces of Bar are created
Bar[] MyBars = {bar1, bar2};
Foo MyFoo = new Foo();
MyFoo.Bars=MyBars.ToList(); //This causes an error saying Collection<Bar> cannot be
//assigned to ICollection<IBar>.

我完全不知道如何正确地做到这一点。填充接口集合的正确方法是什么?

编辑:我实施Foo的方式可能是问题的一部分。

public class Foo : IFoo
{
    public ICollection<IBar> Bars { get; set; }
}

4 个答案:

答案 0 :(得分:1)

按照你的方式,你可以这样做:

ICollection<Bar> MyBars = new Bar[] {bar1, bar2};
MyFoo.Bars = MyBars;

您也可以这样做,以编程方式可能更适合您:

List<Bar> lstBar = new List<Bar>();
lstBar.Add(bar1);
lstBar.Add(bar2);
MyFoo.Bars = lstBar;

整个来源:

public interface IFoo
{
    ICollection<IBar> Bars { get; set; }
}
public interface IBar
{

}
public class Foo : IFoo
{
    public ICollection<IBar> Bars { get; set; }
}
public class Bar : IBar
{
}

class Program
{
    static void Main(string[] args)
    {
        IFoo myFoo = new Foo();
        List<IBar> lstBar = new List<IBar>();
        lstBar.Add(new Bar());
        myFoo.Bars = lstBar;
    }
}

答案 1 :(得分:1)

问题是Foo类应该是:

public class Foo : IFoo
{
    public ICollection<Bar> Bars { get; set; }
}

或者如果您想使用ICollection<IBar>

IBar[] MyBars = { bar1, bar2 };
Foo MyFoo = new Foo( );
MyFoo.Bars = MyBars.ToList( );

或者更优雅的解决方案:

Bar[] MyBars = { bar1, bar2 };
Foo MyFoo = new Foo( );
MyFoo.Bars = MyBars.ToList<IBar>( ); //Cast from Bar to IBar

事实上,问题发生了,因为您无法将ICollection<Bar>转换为ICollection<IBar>

答案 2 :(得分:1)

您如何在此处实现Bars属性。您不能将具体类型分配给接口类型。当您尝试执行ToList转换时,您将其转换为具体列表类型并尝试将其分配给ICollection接口类型,因此它会生成错误。

以下内容应该可以正常使用。

public class Foo:IFoo
{
    public ICollection<IBar> Bars { get; set; }
}

Bar bar1 = new Bar();
Bar bar2 = new Bar();
Bar[] MyBars = { bar1, bar2 };
Foo MyFoo = new Foo();
MyFoo.Bars = MyBars;

答案 3 :(得分:1)

它不会以这种方式工作。请注意,ICollection<T>不是T的协变,因此ICollection<Bar>不是ICollection<IBar>,即使BarIBar

为什么会这样?想象一下,有一些Quux正在实施IBar。如果您可以将ICollection<Bar>分配给ICollection<IBar>,则有人可以使用QuuxICollection<IBar>.Add插入到集合中,因为Quux也是IBar !但该集合是Bar的集合,因此类型安全性将被打破。

你应该试试

IBar[] MyBars = {bar1, bar2};

这样,您MyBars就可以插入其他IBar,而不仅仅是Bar