Допустим, у меня есть следующий класс:
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);
Я летаю здесь слишком высоко, если это невозможно, или веду себя полным идиотом, если для этого уже есть встроенный способ?