EF 5将ICollection转换为另一个

时间:2014-04-21 15:24:32

标签: c# entity-framework

我有一个接受两种类型作为数据源的组件

public interface Ia
{
    ....

    ICollection<Ib> Detail{ get; set; }
}

public interface Ib
{
    ....
}

然后我有两个实现接口的EF类

public class b:Ib
{
}

这是我的问题。如何将MyDetail转换为详细信息和详细信息到MyDetail,我正在尝试使用Detail来封装MyDetail

public class a : Ia
{
    public virtual ICollection<b> MyDetail{get;set;}
    // How to cast MyDetal to Detail and Detail to MyDetail
    // Something like 

    public virtual ICollection<Ib> Detail
    {
       get {return MyDetail;}
       set {MyDetail =  value;}     
    }

}
这是真的吗?还有另一种方法可以执行此转换吗?

1 个答案:

答案 0 :(得分:1)

你不能这样做。 ICollection不是协变的,因此您无法将ICollection<b>视为ICollection<Ib>(在getter中),而且不是逆变,因此您无法处理{{1} }作为ICollection<Ib>(在setter中)。 ICollection<b> 不变。 (请注意,任何东西都不可能是逆变和协变的。

对于你的getter,你可以做的最好的事情是创建一个新的集合并复制所有的元素。你知道它会成功,但你需要制作副本。

对于你的setter,你还需要制作一个新的集合,但是在这里你不知道所有的项目实际上都是ICollection<T>个对象,所以你需要知道如何处理任何不正确的东西。 t(你省略它们,抛出异常,或者是什么)。