Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从字符串动态运行比较?_C#_.net_Dynamic_Evaluation - Fatal编程技术网

C# 如何从字符串动态运行比较?

C# 如何从字符串动态运行比较?,c#,.net,dynamic,evaluation,C#,.net,Dynamic,Evaluation,如果我有这样的字符串: "if (24 == 24) AND ((true == false) OR (true == true)) AND ('HELLO' != 'WORLD')" 如何在使用C#/.Net的代码中动态地计算它 我们有一个动态的“规则引擎”,用户在其中定义规则。所以一个规则可能是 if (@Number == 24) AND ((@SomeVal1 == false) OR (@SomeVal2 == true)) AND ('@CustomerFirstName'

如果我有这样的字符串:

"if (24 == 24) AND ((true == false) OR (true == true)) AND ('HELLO' != 'WORLD')"
如何在使用C#/.Net的代码中动态地计算它

我们有一个动态的“规则引擎”,用户在其中定义规则。所以一个规则可能是

if (@Number == 24) AND ((@SomeVal1 == false) OR (@SomeVal2 == true)) 
  AND ('@CustomerFirstName' != '@CustomerLastName').  

我们希望对@变量进行简单的搜索/替换,然后对字符串求值。

您可以,但这需要大量的跳跃。然而,.net framework有一个可用于生成此类表达式并将其编译为lambda的工具。

恐怕没有简单的方法。
您可以手动解析字符串,然后使用反射获取@foo语法引用的变量、字段或属性,也可以使用反映规则的方法创建动态类型。

将数据视为代码总是会带来一些重大风险,因此,请仔细考虑这将对您的应用程序带来什么样的安全影响

C#通常不是这样一种动态语言,但您可以侵入此功能。是
eval
的C版本的一个示例


根据需要,表达式树也可能是一个选项,正如@Femaref所指出的。

除了Femaref的答案,您还可以尝试自己解释字符串

这种方式可以是某种DSL(领域特定语言)。您可以在此处阅读有关DSL的更多信息:


ANTLR(用于构建DSL的有用工具)

我不确定您的表达式有多复杂。但这里有一个很好的库,我认为它可以处理您的示例表达式。

您是在寻找“表达式解析”还是“从字符串运行C代码”?您是在寻找自己编写代码还是开放库?希望有一个已经存在的库可以做到这一点。这段代码工作得非常好!!非常感谢。谢谢大家的推荐。这看起来很适合数学计算,但不太适合布尔运算。布尔运算是一种数学计算。NCalc库具有逻辑二进制运算符,我们成功地将其用于与您类似的要求。但这些都是基本的表达,这都取决于你的需求有多复杂。