内部表单我将文本框中的用户输入作为文本来执行搜索。还有无线电值过滤搜索。所以我可以按标题,标签和作者搜索一本书。
现在我正在使用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)我有三种方法几乎相同的查询。 如何重构此代码以调用一个方法而不是那三个?
由于
答案 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