将 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。
我有以下问题。我有一个接口 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。