将字符串作为if语句C#注入

本文关键字:语句 注入 if 字符串 | 更新日期: 2023-09-27 18:20:10

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

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

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

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

将字符串作为if语句C#注入

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

例如,假设这个方法在某个条件成立的情况下对字符串执行某些操作,但你不想对该条件进行硬编码

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>当然是谓词)在通过捕获变量定义时也可以利用作用域中的其他信息——在匿名方法上读取。

当然,这不会让你摆脱谓词的条件选择,因为你仍然需要在某个地方这样做:

Func<string, bool> predicate;
if (/* is Firefox */)     predicate = s => s.Length > 2;
else if (/* is Chrome */) predicate = s => s.EndsWith("bar");

然而,它允许您条件移到通用函数之外,而不需要了解浏览器及其差异,并移到更合适的位置。

您可以使用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);