在 c 中计算任意字符串表达式#

Evaluating an arbitrary string expression in c#

提问人:Greg W 提问时间:1/16/2023 更新时间:5/6/2023 访问量:148

问:

我有一个方法,需要根据传递给它的字符串表达式返回 true 或 false。字符串表达式可能如下所示:

(“ASDF”==“A” ||“BED”!=“BED”) && (5>=2)

或计算结果为布尔值结果的任何有效 C# 表达式。我只需要支持基本的字符串和数学比较运算符以及括号。我尝试过 NCalc,但是当我通过它时:

“GEN”==“GEN” ||“GEN”==“GENINTER”

它生成错误 System.ArgumentException:未定义参数(参数“GEN”) 在 NCalc.Domain.EvaluationVisitor.Visit (Identifier 参数)

当我使用以下代码时:

NCalc.Expression e = new(filterExpression, EvaluateOptions.IgnoreCase); var filterResultObject =e.Evaluate();

对如何计算任意表达式的任何想法表示赞赏,因为我在运行时才知道表达式。

格雷格

C# 字符串 比较 NCALC

评论

1赞 Andrew Williamson 1/16/2023
阅读 Rick Strahl 关于运行时代码生成的博客文章
0赞 Klaus Gütter 1/16/2023
表达式是否仅包含字符串和整数文本,或者您也需要变量?
0赞 Klaus Gütter 1/16/2023
你有没有看过类似的问题?stackoverflow.com/questions/56580598/...... stackoverflow.com/questions/1207809/evalstring-to-c-sharp-code
1赞 JonasH 1/16/2023
将用户提供的表达式评估为 c# 代码似乎可能具有潜在危险。如果这是一个问题,使用专门的解析器应该更安全。
0赞 Greg W 1/16/2023
谢谢你的评论。是的,只有字符串、整数、浮点数......无变量。由于对传入的表达式进行了评估,我同意解决方案需要安全,以防止故意格式错误的表达式引起安全问题。这就是为什么我正在寻找一个“评估器”来负责解析、执行操作并生成答案,而不是使用暴露有意注入危险的运行时代码注入。

答:

0赞 Greg W 1/17/2023 #1

我发现 NCalc 会正确评估字符串,但前提是它们是单引号,例如 !('GEN'=='GEN')。如果字符串用双引号引起来,则会引发错误。

0赞 tmt 1/25/2023 #2

对于您的示例,您可以像这样使用 NFun 包:

string str =  "\"ASDF\"==\"A\" || \"BED\"!=\"BED\") && (5>=2)"
bool result = Funny.Calc<bool>(str)
0赞 Dimitris Maragkos 5/6/2023 #3

另一种选择是使用 DynamicExpresso 库。用法示例:

var interpreter = new Interpreter();
bool result = (bool)interpreter.Eval("\"GEN\" == \"GEN\" || \"GEN\" == \"GENINTER\"");

他们还有一个在线工具来测试表达式。