我有一个类似于以下的方法:
StringComparison comparison = StringComparison.CurrentCultureIgnoreCase;
switch(SearchType)
{
case SearchType.Contains:
list = list.Where(a => a.Reference.Contains("test",comparison));
break;
case SearchType.StartsWith:
list = list.Where(a => a.Reference.StartsWith("test",comparison));
break;
case SearchType.EndsWith:
list = list.Where(a => a.Reference.EndsWith("test",comparison));
break;
}
正如你可能猜到的那样,SearchType是我的一个自定义枚举。
有没有一种更简单的方法可以做到这一点,可能是使用反射?多个开关看起来有点难看。
其中哪一部分不容易?
我想你可以为每个枚举都有一个类,从一个通用的SearchType接口继承,并实现一个名为ProcessList的函数——不确定什么列表可以提供更好的函数。
类似。。
interface SearchType
{
object ProcessList(object list, string text);
}
class Contains : SearchType
{
object ProcessList(object list, string text)
{
list = list.Where(a => a.Reference.Contains(text, StringComparison.CurrentCultureIgnoreCase));
}
}
需要为每个枚举类型创建一个类。
然后,您需要像这样设置SearchType变量。。。
SearchType searchType = new Contains();//or something else
然后你的开关可以换成这个。。。
list = searchType.ProcessList(list, "test");
在编码方面并不是很容易,但你得到了一个更可读的代码,而不是开关。
您可以为您的函数提供委托:
Test(Func<string, StringComparison, bool> tester)
{
return tester("test", comparison);
}
这应该有效:
StringComparison comparison = StringComparison.CurrentCultureIgnoreCase;
var methods = new Dictionnary<SearchType, Func<string, string, bool>>();
methods.Add(SearchType.Contains, (str, pattern) => str.Contains(pattern, comparison));
methods.Add(SearchType.StartsWith, (str, pattern) => str.StartsWith(pattern, comparison));
methods.Add(SearchType.EndsWith, (str, pattern) => str.EndsWith(pattern, comparison));
var contains = methods[SearchType.Contains](list, "test");
var startswith = methods[SearchType.StartsWith](list, "test");
var endswith = methods[SearchType.EndsWith](list, "test");
然而,你真的认为它比标准的switch语句更可读吗?