我有一个接受两种类型作为数据源的组件
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;}
}
}
这是真的吗?还有另一种方法可以执行此转换吗?
答案 0 :(得分:1)
你不能这样做。 ICollection
不是协变的,因此您无法将ICollection<b>
视为ICollection<Ib>
(在getter中),而且不是逆变,因此您无法处理{{1} }作为ICollection<Ib>
(在setter中)。 ICollection<b>
不变。 (请注意,任何东西都不可能是逆变和协变的。
对于你的getter,你可以做的最好的事情是创建一个新的集合并复制所有的元素。你知道它会成功,但你需要制作副本。
对于你的setter,你还需要制作一个新的集合,但是在这里你不知道所有的项目实际上都是ICollection<T>
个对象,所以你需要知道如何处理任何不正确的东西。 t(你省略它们,抛出异常,或者是什么)。