在运行时评估表达式

我有一个C#控制台应用程序项目。

我有一个逻辑表达式作为nvarchar存储在数据库中。

例如,存储的表达式为:((34> 0)||(US == ES))&&(4312 = 5691)

在我的应用程序运行时,我想检索表达式并对其进行评估,以便结果为true或false。

我怎么能在运行时这样做?

这是一个非常不寻常的解决方案,涉及JScript:

  • 使用以下代码创建JScript类:

    public class JsMath { public static function Eval(expression:String) : Object { return eval(expression); } } 
  • 将其编译为DLL:

     jsc /target:library /out:JsMath.dll JsMath.js 
  • 在C#项目中,引用JsMath.dll和Microsoft.JScript.dll

  • 现在您可以使用Eval方法,如下所示:

     string expression = "((34 > 0) || ('US' == 'ES')) && (4312 == 5691)"; bool result = (bool)JsMath.Eval(expression); 

优点:

  • 解析表达式无需任何工作,JScript引擎为您完成
  • 无需编译任意代码(如果用户输入代码,则可能是一个很大的安全漏洞)
  • 应该使用任何简单的数学或逻辑表达式,只要它遵循JScript语法

缺点:

  • 没办法传递变量(据我所知)
  • 需要引用JScript程序集(在大多数情况下不是一个大问题,但我不确定此程序集在Client Profile或Silverlight中是否可用)

您可以将表达式解析为.NET Expression类,然后编译并运行它以获得结果。

该类已经支持您的示例中的所有逻辑操作,但它看起来不明确(您以非常类似的方式使用=== )。

您必须编写自己的解析器/转换器。