您可以将必须成立的条件封装在一个谓词中,然后将其传递给执行实际测试的方法。
例如,假设如果某个条件成立,此方法对字符串执行某些操作,但您不想硬编码该条件是什么。你可以这样写:
void PerhapsDoSomething(string input, Func<string, bool> predicate)
{
if (predicate(input))
{
Console.WriteLine("I did something.");
}
}
并像这样使用它:
// Do something if input length > 2
PerhapsDoSomething("foo", s => s.Length > 2);
或者像这样:
// Do something if input ends with "bar"
PerhapsDoSomething("foo", s => s.EndsWith("bar"));
Predicate<T>
谓词(这是一个逻辑术语,尽管当然Predicate<T>
是一个谓词,但不要与委托类型混淆)也可以在通过捕获变量定义时利用范围内的其他信息 - 阅读匿名方法。
当然,这不会让您摆脱predicate 的条件选择,因为您仍然必须在某个地方这样做:
Func<string, bool> predicate;
if (/* is Firefox */) predicate = s => s.Length > 2;
else if (/* is Chrome */) predicate = s => s.EndsWith("bar");
但是,它允许您将条件移到不需要了解任何有关浏览器及其差异的通用函数之外,并移到更合适的位置。