动态计算字串表达式值的类

本文介绍了一种通过CodeDom动态生成程序集并利用反射调用来自定义计算字符串表达式的方法。此外,还探讨了使用ADO.NET DataTable及SQL Server等多种方式实现表达式计算的技术细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近用到了这个功能,要计算一些字符串表达式,如"1 + 3 / 2"等等,就写了这个类。原理很简单,就是用CodeDom动态生成一个包含自定义函数的程序集,再通过反射调用。网上例子极多。我这个类是拿来就可以用的,只需要Copy一下代码就可以直接用,不用读代码。支持常用数学函数,如Sin,Log等,而且不区分大小写。

------------------------------------------------------------------------------------
其实大家可以使用ADO.NET中的DataTable来实现,加入一个DataColumn然后把Expression属性赋值成这个表达式,之后一个筛选返回数据就可以了,简单方便,也比这个快多了
--------------------------------------------------------------------------------------
我用sql实现过这个功能

selecttop1(1+3/2)asretfromtable_namewhere1=1


当时找不到别的办法了,自己写逆根遍历太麻烦了,就想了这个歪点子


歪点子可以更简单点,嘿嘿

select (1+3/2) as Exp1
----------------------------------------------------------------------------------------
还有更好的方法

Microsoft.JScript.Vsa.VsaEngineve=Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
objectqswhEval3(stringExpression)...{
returnMicrosoft.JScript.Eval.JScriptEvaluate(Expression,ve);
}

只需要添加Microsoft.JScript和Microsoft.Vsa两个引用就OK,超简洁....呵呵

------------------------------------------------------------------------------------------
这样做不错,但是搂住没有考虑到一个问题,每做一次计算,就会编译出来一个Assembly,并装载在当前的AppDomain,这样随着程序的不断计算,越来越多地Assembly被装载在当前AppDomain,一个Assembly一旦被装载,除非所在的AppDomain被卸载,否则。net是不能单独卸载某个Assembly,这样使用的内存会越来越多,又不能被垃圾回收
-----------------------------------------------------------------------------------------
最简单的方法:

stringexp="(5+6)*8-3/2-4+3";
DataTablemyDataTable
=newDataTable("CalcTable");
exp
=Convert.ToString(myDataTable.Compute(exp,""));


-----------------------------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值