2013-12-03 2 views
0

Внутри формы Я беру пользователей из текстового поля в качестве текста для выполнения поиска. Также есть значения радио, которые фильтруют поиск. Поэтому я могу искать книгу по названию, по тегу и по автору.Насколько зрелым это является для генериков

Прямо сейчас я использую оператор switch, чтобы определить, какое значение радио выбрано и на основе этого значения. Я вызываю репозиторий для извлечения данных.

var checkedSearchBy = panelSearchBy.Controls.OfType<RadioButton>() 
         .FirstOrDefault(r => r.Checked); 

string searchBy = checkedSearchBy.Text; 
case "ByTitle": 
    var data = repository.GetDetailsByTitle(txtUsersInput); 
    break; 
case "ByTag": 
    var data = repository.GetDetailsByTag(txtUsersInput); 
    break; 
case "ByAuthor": 
    var data = repository.GetDetailsByAuthor(txtUsersInput); 
    break; 

и репозитории стороны (я использую щеголеватый ОРМ) У меня есть три метода, который почти идентичные запросы. Как я могу реорганизовать этот код для вызова одного метода вместо трех?

Благодаря

ответ

3

Один из способов сделать это, чтобы определить делегат, соответствующие подписи ваших «Получить» методы там, и определить фиксированный словарь типа <string,(DelegateName)>.

Тогда вы можете просто сделать var data = myDictionary[searchBy](txtUsersInput)

Например, в определении класса:

private delegate void MyDelegate(string input); 
private Dictionary<string, MyDelegate> myDictionary; 

и в конструкторе:

myDictionary = new Dictionary<string, MyDelegate> { 
    { "ByTitle", repository.GetDetailsByTitle }, 
    { "ByTag", repository.GetDetailsByTag } 
    /*etc*/ 
}; 
+0

вы можете предоставить более подробную информацию, пожалуйста. Если я правильно понял, я бы удалил оператор switch и сохранил существующие три метода? – user2783193

+0

Теперь я думаю об этом, я не совсем уверен, что это решает вашу проблему, поскольку вам все еще нужны три метода. Чтобы знать, как реорганизовать эти три метода в одном, вам, вероятно, нужно будет показать нам эти методы или, по крайней мере, то, что меняется между ними. – Flynn1179

1

Простой пример:

var list = new[] { "Hello", "World", "Example" }; 

var dictionary = new Dictionary<string, Func<IEnumerable<string>, IEnumerable<string>>>(); 

dictionary.Add("alphabet", a => a.OrderBy(b => b)); 
dictionary.Add("length", a => a.OrderBy(b => b.Length)); 

var result = dictionary["alphabet"](list); 

Возвращает

Example 
Hello 
World 
Смежные вопросы