曾经有个需求,要把一段字符串表达式作为C#的一段语句来执行。或者直接在sql中存储上不同的含参数的工时如
180+20*(n-4)。查出来之后带入参数计算。又好比在win7计算器中粘贴一个表达式,直接输出了结果。
碰到这个问题,查了一下网上的资料,发现有以下几种适合我的方案:
1.把表达式用字符串的各种函数拆分出来数字和小括号和运算符的组合。然后去运算(即自己写一个类和函数)
2.采用T-sql脚本计算。在oracle中 select
180+20*(10-4) from dual; 在sqlserver中
select
180+20*(10-4) 即可。
3.使用
JavaScript脚本函数中的eval方法。(常见)
使用.Net组件
/* 需将Microsoft.JScript 和Microsoft.Vsa加入参考并引用Microsoft.JScript */
public object EvalExpress( string sExpression)
{
Microsoft.JScript.Vsa.VsaEngine ve = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
return Microsoft.JScript.Eval.JScriptEvaluate(sExpression, ve);
}
或者使用.Com组件
public object EvalExpress( string sExpression)
{
Microsoft.JScript.Vsa.VsaEngine ve = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
return Microsoft.JScript.Eval.JScriptEvaluate(sExpression, ve);
}
/* 需引用com组件
microsoft script control
public object EvalExpress( string sExpression)
{
MSScriptControl.ScriptControl scc = new MSScriptControl.ScriptControl();
public object EvalExpress( string sExpression)
{
MSScriptControl.ScriptControl scc = new MSScriptControl.ScriptControl();
scc.Eval(
sExpression
);
}
EvalExpress这个方法便可以将sExpression作为表达式执行,运行结果返回是object,但是根据参数内容不同,可以转换成bool、int、string等。
不过既然是使用脚本引擎来执行的,速度不会太好。而且这两个组件在VS05中提示已过时,但是在提示信息和MSDN中没找到替代方案。