有条件地调用StartsWith / EndsWith的最佳方式

时间:2012-01-16 10:49:06

标签: c# reflection

我有一个类似于以下的方法:

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是我的自定义枚举。

是否有更简单的方法可以使用反射?多个开关看起来有点难看。

3 个答案:

答案 0 :(得分:1)

哪一部分不容易?

我想你可以为每个enum创建一个类,从一个常见的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");

...在编码方面并不是那么容易,但是你会得到一个更易读的代码而不是交换机。

答案 1 :(得分:0)

您可以为您的职能提供代表:

Test(Func<string, StringComparison, bool> tester)
{
    return tester("test", comparison);
}

答案 2 :(得分:-1)

这应该有效:

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语句更具可读性吗?