这对于仿制药有多成熟

时间:2013-12-03 12:45:07

标签: c# .net winforms

内部表单我将文本框中的用户输入作为文本来执行搜索。还有无线电值过滤搜索。所以我可以按标题,标签和作者搜索一本书。

现在我正在使用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;

并且在存储库端(我正在使用dapper orm)我有三种方法几乎相同的查询。 如何重构此代码以调用一个方法而不是那三个?

由于

2 个答案:

答案 0 :(得分:3)

执行此操作的一种方法是定义与“Get”方法的签名匹配的委托,并定义类型为<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*/
};

答案 1 :(得分: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