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

时间:2013-04-24 16:56:35

标签: 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' != '@CustomerLastName').  

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

5 个答案:

答案 0 :(得分:2)

你可以,但是需要花很多时间来跳过篮球。但是,.net框架有Expression Trees,可用于生成此类表达式并将它们编译为lambda。

答案 1 :(得分:2)

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

C#通常不是这样的动态语言,但你可以破解这个功能。 Hereeval的C#版本的示例。

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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