Допустим, у меня есть следующий класс:
public class Person {
public string FirstName { get; set; }
public string SurName { get; set; }
public int Age { get; set; }
public string Gender { get; set; }
}
Кроме того, у меня есть следующий метод, и я обращаюсь к личным данным через репозиторий.
public IEnumerable<Person> getPeople(string searchField, string searchTerm) {
//_repo.GetAll() returns IEnumerable<Person>
var model = _repo.GetAll();
//Need the logic here for filtering
return model;
}
Как вывидно, что я получаю два параметра для метода: searchField
и searchTerm
.
searchField
- для имени поля, значение которого будет использоваться для фильтрации.searchTerm
- это значение, которое будет использоваться для сравнения с восстановленным значением (извините, если я не совсем уверен, но это самое большее, что я могу придумать)
То, что я обычно делал бысделать это следующим образом:
public IEnumerable<Person> getPeople(string searchField, string searchTerm) {
//_repo.GetAll() returns IEnumerable<Person>
var model = _repo.GetAll();
switch(searchField) {
case "FirstName":
model = model.Where(x => x.FirstName == searchTerm);
break;
case "SurName":
model = model.Where(x => x.SurName == searchTerm);
break;
//Keeps going
}
return model;
}
, который будет работать очень хорошо.Но если я внесу изменения в свой класс, в этом коде будет изменение, которое будет нарушено или в нем отсутствуют некоторые функции, если я добавлю новые свойства этому классу.
То, что я ищу, выглядит примерно так:
ПРИМЕЧАНИЕ:
Этот код ниже полностью принадлежит моему воображению, и такого понятия не существует.
model = model.Where(x => x.GetPropertyByName(searchField) == searchTerm);
Я летаю слишком высоко, если это невозможно, или я полный идиот, если для этого уже есть способ?