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库具有逻辑二进制运算符,我们成功地将其用于与您类似的要求。但这些都是基本的表达,这都取决于你的需求有多复杂。