4

如果我有一个这样的字符串:

"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').  

我们想对 @ 变量进行简单的搜索/替换,然后评估字符串。

4

5 回答 5

2

你可以,但它需要大量的跳跃。但是,.net 框架具有表达式树,可用于生成此类表达式并将它们编译为 lambda。

于 2013-04-24T16:59:22.883 回答
2

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

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

正如@Femaref 指出的那样,根据需要,表达式树也可能是一种选择。

于 2013-04-24T17:00:33.330 回答
1

除了 Femaref 的回答之外,您还可以尝试自己解释字符串。

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

ANTLR(用于构建 DSL 的有用工具)http://www.antlr.org/wiki/display/ANTLR3/Antlr+3+CSharp+Target

于 2013-04-24T17:01:56.907 回答
0

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

于 2013-04-24T17:00:17.093 回答
0

我不确定你可能有多么复杂的表达方式。但这是一个不错的库,我认为它可以处理您的示例表达式。 http://ncalc.codeplex.com/

于 2013-04-24T17:11:04.030 回答