Реализуйте универсальный абстрактный класс для интерфейса, который также является универсальным - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть этот абстрактный класс:

public abstract class Entity<T> where T : struct
{
    public T ID { get; set; }
    ... other properties for modify
}

Я пытаюсь реализовать этот класс в своем IRepository.то, что я пробовал, это:

public interface IRepository<T> where T : Entity<T> //Entity<T> doesn't make sense here i should use either T2 or what should i do?

Также я пытался заставить его работать так:

public interface IRepository<T> where T : Entity<object>

Как правильно это сделать?

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Вы можете определить следующие абстракции:

public abstract class Entity<TKey>
    where TKey : struct
{
    public TKey Id { get; set; }
}

public interface IRepository<TEntity, TKey>
    where TEntity : Entity<TKey>
    where TKey : struct
{
    IEnumerable<TEntity> GetAll();
    TEntity GetById(TKey id);
}

Тогда как использование, например:

public class Repository<TEntity, TKey> : IRepository<TEntity, TKey>
    where TEntity : Entity<TKey>
    where TKey : struct
{
    DbContext db;
    public Repository(DbContext db)
    {
        this.db = db;
    }
    public IEnumerable<TEntity> GetAll()
    {
        return db.Set<TEntity>();
    }
    public TEntity GetById(TKey id)
    {
        return db.Set<TEntity>().FirstOrDefault(x => x.Id.Equals(id));
    }
}
0 голосов
/ 30 декабря 2018

Я не уверен, чего вы пытаетесь достичь, но следующее законно;ваш репозиторий имеет то же общее ограничение, что и ваш класс Entity:

public interface IRepository<T> where T: struct
{
    Entity<T> GetEntityById(int id);
    ...
}

Или следующее будет работать, но я не знаю, как вы хотите использовать T:

public interface IRepository<T,U> where T : Entity<U> where U: struct
{
    Entity<U> GetEntityById(int id);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...