将条件字符串解析为布尔值

parse string with condition to boolean

我正在寻找一种从字符串中获取布尔值的方法。

我有一个字符串,存储在数据库中,这是要测试的条件。 假设字符串 = "[number] < 10000" 在我的代码中,我计划用实际数字替换 [number],这样字符串将变为“100 < 10000”。

有没有一种简单的方法可以将此字符串计算为布尔值。 在这种情况下,它将是 False。

另一个例子:“[number] > 100 && [number] < 1000” 如果 number 为 200,则评估为 True。

如果我在这个条件下添加代码会怎么样,比如 "if ([number] > 100 && [number] < 1000) { return true;} else {return false;}"

是否有一种简单的方法可以使用代码从此字符串中获取 return 值?

如果您需要更多控制,则必须根据表示逻辑操作的动态字符串创建表达式。例如,我已经采取了你的第一个案例 "[number]<1000" 你可以尝试以下:

 static void Main(string[] args)
        {
            string code = "[number] < 10000".Replace("[number]", "100");
            string[] operands = code.Split('<');
            var comparison = Expression.LessThan(
              Expression.Constant(operands[0]),
              Expression.Constant(operands[1]));
            var lambda = Expression.Lambda<Func<bool>>(comparison).Compile();
            bool result = lambda();

        }

或者您可以使用现有的库或 nuget 包以更简单的方式做同样的事情(虽然在引擎盖下它们做同样的事情):

 string code = "[number] < 10000".Replace("[number]", "100");
    func = ExpressionParser.Compile<Func<bool>>(code);
    bool result = func()

它使用 Lambda 解析器,如图所示 here

您可以使用 DynamicExpression class, it is available in this nuget 包。它可以即时计算表达式。

下面是一个例子,

var expression = System.Linq.Dynamic.DynamicExpression.ParseLambda(
            new System.Linq.Expressions.ParameterExpression[] { },
            typeof(bool),
            "100 > 1000",
            new object[] { });
        var compiledDelegate = expression.Compile();
        var result = compiledDelegate.DynamicInvoke(null);

结果将为假,因为提供的表达式“100 > 1000”为假。