1

好的,我现在在网上搜索了一个小时,试图找到我的问题是否有解决方案。问题是:有没有办法注入一个字符串,该字符串将被解析到您放入 if 子句的语句中?

场景:我正在构建一个从浏览器解析信息的小软件。每个浏览器都以不同的方式表示数据,因此我想要 IF 语句,我必须根据浏览器提出不同的问题,但我不想用 IF ..... ELSE IF ... .所有这一切,因为它会是错误的。

如果用户来自 FF,问题将是页面是否包含某个字符串。如果用户来自 IE,问题将是是否有 100 行文本。

问题是不同的,我想知道我是否可以从我正在编码的函数外部发送语句以解析来自所有浏览器的信息,还是我必须根据浏览器提出问题?

4

2 回答 2

4

您可以将必须​​成立的条件封装在一个谓词中,然后将其传递给执行实际测试的方法。

例如,假设如果某个条件成立,此方法对字符串执行某些操作,但您不想硬编码该条件是什么。你可以这样写:

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

但是,它允许您将条件移到不需要了解任何有关浏览器及其差异的通用函数之外,并移到更合适的位置。

于 2013-06-28T08:43:39.870 回答
1

您可以使用Func<>谓词将部分代码发送到方法中:

private void Parse(string data, Func<string, bool> question) {
  if (question(data)) {
    // go on
  }
}

您可以使用任何与签名匹配的函数来调用它,例如:

private bool CheckFx(string data) {
  return data.IndexOf("Hello") != -1;
}

Parse(data, CheckFx);

或者:

Parse(data, s => s.Split(Environment.Newline).Length >= 100);

您还可以在选择使用什么时将谓词保留在变量中:

Func<string, bool> question;
switch (browser) {
  case Browser.IE: question = CheckIE; break;
  case Browser.Fx: question = CheckFx; break;
  default: question = CheckOther; break;
}
Parse(data, question);
于 2013-06-28T08:47:37.663 回答