Я хочу добавить метод, который создаст IEnumerable для сущностей в моем проекте. Все объекты будут иметь раскрывающийся список для захвата/редактирования, поэтому, на мой взгляд, имеет смысл добавить это в мой общий метод репозитория.
Я не совсем уверен, возможно ли это или как лучше всего подойти к этому, поскольку я использую общие классы, надеюсь, что следующий фрагмент кода продает мою идею:
public interface ISpaceRepository<T>
where T : class
{
SpaceResult<T> GetAll();
SpaceResult<T> FindBy(Expression<Func<T, bool>> predicate);
SpaceResult<T> Add(T entity);
SpaceResult<T> Delete(T entity);
SpaceResult<T> Edit(T entity);
SpaceResult<T> FindById(int id);
SpaceResult<T> SelectList();
}
Очень простое определение интерфейса. Это реализуется в моем классе SpaceRespository:
public class SpaceRepository<T>
: ISpaceRepository<T> where T : class
{
// content omitted for ease of reading
}
В моем репозитории я хотел бы создать метод, который будет создавать коллекцию IEnumerable для типа T. Проблема здесь в том, что по умолчанию T не предоставляет никаких свойств, поэтому я не могу получить T.Name и T.Id, поэтому я играю с предикатом, чтобы выполнить работу:
public SpaceResult<T> SelectList(Expression<Func<T, bool>> predicate)
{
SpaceResult<T> result = new SpaceResult<T>();
try
{
result.SelectList = this.GetAll().Select(predicate);
}
catch (System.Exception ex)
{
result.IsError = true;
result.Message = ex.Message;
result.InnerException = ex.InnerException.Message;
}
return result;
}
Этот подход работает, но мне приходится определять предикат каждый раз, когда я создаю коллекцию выбранных элементов для привязки к раскрывающемуся списку в Razor (MVC).
Может есть способ проще? Рефлексия слишком затратна. Нет особой причины не делать этого на уровне модели представления, я просто играю с парой идей во время обучения: $.
Обновить
Идея состоит в том, чтобы предоставить общий метод, который создаст коллекцию элементов SelectListItem для данного объекта базы данных T в шаблоне репозитория, не заставляя меня или другого разработчика дублировать код для каждой из таблиц в базе данных.
Обновление 1
Пример:
ISpaceRepository<Building> _repo = new SpaceRepository<Building>();
SpaceResult<Building> result = this._repo.SelectList((x => new SelectListItem {
x.Id,
x.Description }));
Обновление 2
Здание выглядит так:
[Table("buildings")]
public class Building
{
[Column("id")]
[Key]
public int Id {get;set;}
[Column("description")]
public string Description {get;set;}
}
Поэтому я подумал, что, может быть, если я добавлю настраиваемый атрибут в нужные мне столбцы в списке выбора, я смогу использовать отражение, но это звучит дорого для решения, которое мне нужно.
[Table("buildings")]
public class Building
{
[Column("id")]
[Key]
[SelectListItem]
public int Id {get;set;}
[Column("description")]
[SelectListItem]
public string Description {get;set;}
}
ISpaceRepository<T>
— это интерфейс, он реализуется в вашем классеSpaceRepository
. - person O. R. Mapper   schedule 02.04.2015predicate
? У разных типов дляT
нет общего предка, который бы предоставлял какие-либо свойства, общие для всех возможных типовT
? - person O. R. Mapper   schedule 02.04.2015predicate
, а какая-то другая функция, зависящая от типа, которая предоставляет некоторую информацию об элементах — та, которую вы, возможно, захотите передать вSelectList
, чтобы вы могли использовать ее возвращаемое значение в методе. - person O. R. Mapper   schedule 02.04.2015