将条件字符串解析为布尔值
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”为假。
我正在寻找一种从字符串中获取布尔值的方法。
我有一个字符串,存储在数据库中,这是要测试的条件。 假设字符串 = "[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”为假。