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

时间:2018-02-24 10:22:00

标签: c# eval

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

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

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

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

如果我在这种情况下添加代码,例如" if([number]> 100&& [number]< 1000){return true;} else {return false;}&#34 ;

如果有一种简单的方法可以从代码中获取该字符串的返回值吗?

2 个答案:

答案 0 :(得分:2)

您可以使用 DynamicExpression 类,此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);

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

答案 1 :(得分:1)

如果需要更多控制,则必须根据表示逻辑运算的动态字符串创建表达式。例如,我已经采取了您的第一个案例"[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

所示