Я построил общий интерфейс репозитория, от которого зависает ряд интерфейсов репозитория, специфичных для сущности. Зеркалирование этой структуры - это ряд конкретных классов репозитория.Тип 'TEntity' не соответствует ожидаемому типу '???'
Я получаю следующее сообщение об ошибке в моем базовом классе Repository:
Тип 'TEntity' не соответствует ожидаемого типа '???'.
Метод 'GetAll' не может реализовать метод из интерфейса '... IRepository < TEntity, TIdentity >'. Тип возврата должен быть «System.Collections.Generic.List <???> '.
Минимизированный интерфейс/структура классов выглядит следующим образом:
IRepository:
public interface IRepository<TEntity, in TIdentity> where TEntity : IEntity<TIdentity>
{
...
List<TEntity> GetAll();
...
}
Repository:
internal class Repository<TEntity, TIdentity> : IRepository<TEntity, TIdentity>
where TEntity : class, IEntity<TIdentity>
{
...
protected DbSet<TEntity> Set => _set ?? (_set = _context.Set<TEntity>());
public List<TEntity> GetAll()
{
return Set.ToList();
}
...
}
IRoleRepository:
public interface IRoleRepository : IRepository<Role, Guid>
{
...
Role FindByName(string roleName);
...
}
RoleRepository:
internal class RoleRepository : Repository<Role, Guid>, IRoleRepository
{
...
public Role FindByName(string roleName)
{
return Set.FirstOrDefault(x => x.Name == roleName);
}
...
}
Это стук эффект в моих классах потребляющих где проделывают RoleRepository.GetAll()
Возвращает List<???>
, а не List<Role>
, как я ожидал.
Edit - Entity определения ...
IEntity:
public interface IEntity<T>
{
T Id { get; set; }
byte[] Version { get; set; }
}
Entity:
public abstract class Entity<T> : IEntity<T>
{
public T Id { get; set; }
public byte[] Version { get; set; }
}
Роль:
public class Role : Entity<Guid>
{
private ICollection<User> _users;
public string Name { get; set; }
public ICollection<User> Users
{
get { return _users ?? (_users = new List<User>()); }
set { _users = value; }
}
}
Я думаю, что это должно быть 'Set.ToList();' –
vendettamit
Спасибо, попробовал это, но он не разрешил ошибку. Также ReSharper говорит мне, что спецификация аргументов типа избыточна. –
Является ли ваш TEntity реализующим все интерфейсы, из которых вызывается инструкция? Я думаю, что TEntity не реализует IEntity, поскольку TEntity - тип EF. Попробуйте удалить из этого репозитория. –
MadOX