Реализация шаблонного метода интерфейса - C#

Узнай цену своей работы

Формулировка задачи:

Суть в том, что есть интерфейс
 
interface IAction
    {
        List<T> GetAll<T>();
    }
и множество классов реализующих его, по типу
 
    public class MyClass1 : IAction
    {
        public List<SomeClass1> GetAll<SomeClass1>()
        {
            return SomeClass1List;//тут лист обьектов пользовательского класса
        }
SomeClass1 - пользовательский класс, их много(12 штук). ругается что не может преобразовать SomeClass1List к List<SomeClass1>. Предугадывая вопрос зачем такой гемор - задания куратора. Вопрос заключается в том, можно ли реализовать интерфейс, с четким указание что возращать в момент реализации в пользовательском классе?

Решение задачи: «Реализация шаблонного метода интерфейса»

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();
        }
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.4 из 5