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

C# 有条件地调用StartsWith/EndsWith的最佳方式,c#,reflection,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

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

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


有没有一种更简单的方法,可能是使用反射?多个开关看起来有点难看。

您可以为您的函数提供一个委托:

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

这其中哪一部分不容易

我想您可以为每个枚举创建一个类,从一个公共SearchType接口继承,并实现一个名为ProcessList的函数——不确定哪个list可以提供更好的函数

类似于

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");

…就编码而言,这并不容易,但您可以获得更可读的代码,而不是开关。

没有。任何带有反射的方法都是一种更糟糕的方法。反射会影响性能。似乎您正在列表上调用字符串方法,然后为列表指定布尔值。这是问题中的一个错误,还是您试图根据比较来过滤列表?使用反射比这更简单?不,你的东西怎么了?如果你对反射做任何事情,你就会开始依赖与列表方法同名的枚举成员,从而创建脆弱的代码。所有这些成员都返回bool,不是吗?谢谢-我想我愚蠢地期望反射在这里会有很大的帮助。我想我还是按开关吧。缪斯规则顺便说一句!