将EntitySet实现为IList

本文关键字:IList 实现 EntitySet | 更新日期: 2023-09-27 18:02:37

我在玩LinqToSql,我试图为我的一个类实现存储库模式。问题来了,当我试图映射属性是EntitySet到IList我得到一个错误

TheCore.Models。User'没有实现接口成员' core . models . iuserrepository . vehicles '。"TheCore.Models.User。车辆不能实现core . models . iuserrepository。因为它没有匹配的返回类型System.Collections.Generic.IList

EntitySet似乎实现了IList,所以为什么我不能映射IList属性到EntitySet属性?

EntitySet:

        [global::System.Data.Linq.Mapping.AssociationAttribute(Name="Users_Vehicles", Storage="_Vehicles", ThisKey="Id", OtherKey="FkOwnerId")]
    public EntitySet<Vehicle> Vehicles
    {
        get
        {
            return this._Vehicles;
        }
        set
        {
            this._Vehicles.Assign(value);
        }
    }

存储库接口:

        IList<Vehicle> Vehicles { get; set; }

将EntitySet实现为IList

接口实现的返回类型必须与接口中声明的返回类型匹配。这被称为返回类型协方差,c#不支持。

所以即使List实现了IList

下面的代码也不起作用
public interface IFoo
{
    IList<string> Foos {get; set;}
}
public class Foo : IFoo
{
    public List<string> Foos {get; set;}
}

看看这个问题:"Interface not implemented"当返回派生类型

我可能不理解你的问题,但似乎你有一个方法IList<Vehicle> Vehicles { get; set; }的接口,并试图通过提供实现public EntitySet<Vehicle> Vehicles来履行合同。这是不允许的——实现必须提供与接口相同的返回类型(在本例中为IList<Vehicle>)。如果可以,更改存储库实现以包装EntitySet,然后将方法与所需的接口匹配:

public class Vehicle
{
}
public interface IRepository
{
    IList<Vehicle> Vehicles { get; set; }
}
public class Repository : IRepository
{
    private EntitySet<Vehicle> _Vehicles;
    public IList<Vehicle> Vehicles
    {
        get
        {
            return this._Vehicles;
        }
        set
        {
            this._Vehicles.Assign(value);
        }
    }
}