Реализация шаблонного метода интерфейса - C#
Формулировка задачи:
Суть в том, что есть интерфейс
и множество классов реализующих его, по типу
SomeClass1 - пользовательский класс, их много(12 штук).
ругается что не может преобразовать SomeClass1List к List<SomeClass1>.
Предугадывая вопрос зачем такой гемор - задания куратора.
Вопрос заключается в том, можно ли реализовать интерфейс, с четким указание что возращать в момент реализации в пользовательском классе?
interface IAction
{
List<T> GetAll<T>();
}
public class MyClass1 : IAction
{
public List<SomeClass1> GetAll<SomeClass1>()
{
return SomeClass1List;//тут лист обьектов пользовательского класса
}Решение задачи: «Реализация шаблонного метода интерфейса»
textual
Листинг программы
public class Repository<TEntity> : IRepository<TEntity> where TEntity : BaseEntity
{
private readonly DbContext _context; //контекст, предоставляет доступ к базе данных
private readonly DbSet<TEntity> _dbSet; //представляет таблицу из базы - одну определенную сущность
/// <summary>
/// Создание хранилища
/// </summary>
public Repository(DbContext dbContext)
{
_context = dbContext;
_dbSet = _context.Set<TEntity>();
}
#region IRepository
/// <summary>
/// Сохранение новой записи в хранилище(если id = 0), или обновление уже существующей
/// </summary>
/// <param name="entity">Сущность которую нужно внести в базу, или обновить</param>
public TEntity SaveOrUpdate(TEntity entity)
{
if (entity.Id == 0) return _dbSet.Add(entity);
_dbSet.Attach(entity);
_context.Entry(entity).State = EntityState.Modified;
return entity;
}
/// <summary>
/// Удалить сущность из хранилища
/// </summary>
public void Remove(TEntity entity)
{
_dbSet.Remove(entity);
}
/// <summary>
/// Удалить список сущностей из хранилища
/// </summary>
public void RemoveRange(IEnumerable<TEntity> entity)
{
_dbSet.RemoveRange(entity);
}
/// <summary>
/// Получить сущность по id
/// </summary>
public TEntity Get(int id)
{
return _dbSet.FirstOrDefault(v => v.Id == id);
}
/// <summary>
/// Найти одну сущность по заданому предикату
/// </summary>
/// <param name="predicate">Предикат поиска</param>
public TEntity FindOne(Expression<Func<TEntity, bool>> predicate)
{
return _dbSet.SingleOrDefault(predicate);
}
/// <summary>
/// Найти все сущности по заданому предикату
/// </summary>
/// <param name="predicate">Предикат поиска</param>
public IQueryable<TEntity> FindAll(Expression<Func<TEntity, bool>> predicate)
{
return _dbSet.Where(predicate);
}
/// <summary>
/// Получить все сущности данного типа из хранилища
/// </summary>
public IQueryable<TEntity> All()
{
return _dbSet;
}
/// <summary>
/// Сохранить изменения в хранилище
/// </summary>
public void SaveChanges()
{
try
{
_context.SaveChanges();
}
catch (DbEntityValidationException dbValidEx) //отлавливаем ошибки валидации в базе
{
throw new DataException(dbValidEx.Message, dbValidEx);
}
catch (DataException dataEx) //отлавливаем ошибки из базы
{
throw new DataException(dataEx.Message, dataEx);
}
catch (Exception ex) //отлавливаем остальные ошибки
{
throw new Exception(ex.Message, ex);
}
}
#endregion
/// <summary>
/// Освобождение всех ресурсов
/// </summary>
public void Dispose()
{
_context.Dispose();
}
}