将ICollection转换为Collection并同时转换其参数

时间:2015-04-15 22:41:33

标签: c# generics collections casting

我有以下问题。我有一个接口IUserGroup和一个实体框架UserGroupEF的实现。代码是(抱歉,变量主要是波兰语):

public partial class UzytkownikGrupaEF : IUzytkownikGrupa
{
    //something
}

public partial class GrupaEF 
{
 private ICollection<UzytkownikGrupaEF> _Uzytkownicy;

  public virtual ICollection<UzytkownikGrupaEF> UzytkownicyEF
    {
        get { return _Uzytkownicy; }
    }
    /*
    ...
    */
     [NotMapped]
    public ICollection<IUzytkownikGrupa> Uzytkownicy //so in application i dont have to use EF types - just interfaces
    {
        get { return (ICollection<IUzytkownikGrupa>)this.UzytkownicyEF; } //Here is problem - i cant cast Collection<UzytkownikGrupaEF> to ICollection<IUzytkownikGrupa>         
    }
}

所以你可以看到我希望能够从Collection<UserGroupEF>ICollection<IUserGroup>做一个漂亮而干净的演员,而不需要做奇怪的循环和复制数据。

1 个答案:

答案 0 :(得分:2)

首先,Eric Lippert关于C#Why can I not assign a List of concrete types to a List of that concrete's interface?中的共同/控制方差的解释 因此,要使其工作,您需要将属性类型更改为IEnumerable,因为IEnumerable是协变的(在C#4中)而ICollection不是。

[NotMapped]
public IEnumerable<IUzytkownikGrupa> Uzytkownicy    {
    get { return this.UzytkownicyEF; }
}

其次,您可以Enumerable.Cast方法转换您的收藏。