EF 5将一个集合转换为另一个集合

本文关键字:集合 一个 转换 另一个 EF | 更新日期: 2023-09-27 17:59:09

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

public interface Ia
{
    ....
    ICollection<Ib> Detail{ get; set; }
}
public interface Ib
{
    ....
}

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

public class b:Ib
{
}

这就是我的问题。如何将MyDetail转换为Detail并将Detail转换成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;}     
    }
}

这可能吗?有另一个合适的人来进行这次对话吗?

EF 5将一个集合转换为另一个集合

您不能这样做。ICollection不是协变的,因此不能将ICollection<b>视为ICollection<Ib>(在getter中),它也不是逆变的,因此无法将ICollection<Ib>视为ICollection<b>(在setter中)。ICollection<T>不变量。(注意,任何事物都不可能同时是反变的和协变的。

对于getter来说,您所能做的最好的事情就是创建一个新的集合并复制所有元素。你知道它会成功,但你确实需要复制。

对于您的setter,您还需要创建一个新的集合,但在这里您不知道所有的项实际上都是b对象,所以您需要知道如何处理任何不是的项(您是否忽略了它们、抛出异常或其他什么)。