Я реализую шаблон репозитория, и я хотел бы, чтобы FooRepository
можно было повторно использовать для всех моделей, которые реализуют IEntity
, однако IDE (Rider) сообщает, что Type parameter 'IEntity' hides interface 'IEntity'
и более поздние версии вызывают сообщение об ошибке Cannot resolve symbol 'ID'
в методе GetById
.
Как правильно создать базовый класс для универсальных типов (в данном случае IEntity
), который также реализует интерфейс, который принимает тот же универсальный класс?
Конечная цель состоит в том, чтобы повторно использовать FooRepository
для других моделей (кроме Bar
) в качестве методов, таких как GetById
, поскольку они в основном будут функционировать одинаково между ними.
public abstract class FooRepository<IEntity> : IRepository<IEntity>
{
private List<IEntity> _data;
public List<IEntity> GetAll()
{
return this._data;
}
public IEntity GetById(int id)
{
return this.GetAll().Single(c => c.ID == id);
}
}
public class BarRepository : FooRepository<Bar>
{
}
public interface IEntity
{
int ID { get; set; }
}
public interface IRepository<IEntity>
{
List<IEntity> GetAll();
IEntity GetById(int id);
}
public class Bar : IEntity
{
public int ID { get; set; }
public string Name { get; set; }
}