将 ICollection 转换为 Collection 并同时转换它们的参数

Casting ICollection to Collection and while casting their parameters as well

我有以下问题。我有一个接口 IUserGroup 和一个 Entity Framework 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> 进行漂亮而干净的转换,而无需执行奇怪的循环和复制数据。

首先是 Eric Lippert 在 C# Why can I not assign a List of concrete types to a List of that concrete's interface? 中对 co-/contr-variance 的解释 因此,要使其正常工作,您需要将 属性 类型更改为 IEnumerable,因为 IEnumerable 是协变的(在 C# 4 中)而 ICollection 不是。

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

其次,您可以Enumerable.Cast方法来转换您的collection。