我正在寻找一种从字符串中获取布尔值的方法。
我有一个存储在数据库中的字符串,这是一个要测试的条件。 假设string =" [number]< 10000" 在我的代码中,我计划用实际数字替换[数字],因此字符串将变为" 100< 10000"
是否有一种简单的方法可以将此字符串计算为布尔值。 在这种情况下,它将是假的。
另一个例子:" [编号]> 100&& [编号]< 1000" 如果number为200,则评估为True。
如果我在这种情况下添加代码,例如" if([number]> 100&& [number]< 1000){return true;} else {return false;}&#34 ;
如果有一种简单的方法可以从代码中获取该字符串的返回值吗?
答案 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
所示