Реализовать EntitySet как IList
Я играю с LinqToSql и пытаюсь реализовать шаблон Repository для одного из моих классов. Проблема возникает, когда я пытаюсь сопоставить свойство, которое является EntitySet к IList, я получаю ошибку
"TheCore.Models.User" не реализует элемент интерфейса "TheCore.Models.IUserRepository.Vehicles". "TheCore.Models.User.Vehicles" не может реализовать "TheCore.Models.IUserRepository.Vehicles", поскольку у него нет соответствующего возвращаемого типа "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; }
2 ответа
Возвращаемый тип реализации интерфейса должен соответствовать возвращаемому типу, объявленному в интерфейсе. Это называется ковариацией возвращаемого типа, и она не поддерживается C#.
Таким образом, приведенный ниже код не работает, хотя List
инвентарь IList
public interface IFoo
{
IList<string> Foos {get; set;}
}
public class Foo : IFoo
{
public List<string> Foos {get; set;}
}
Посмотрите на этот вопрос: "Интерфейс не реализован" при возврате производного типа
Возможно, я не понимаю ваш вопрос, но, похоже, у вас есть интерфейс с методом 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);
}
}
}