在运行时评估表达式
我有一个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
类,然后编译并运行它以获得结果。
该类已经支持您的示例中的所有逻辑操作,但它看起来不明确(您以非常类似的方式使用==
和=
)。
您必须编写自己的解析器/转换器。