利用C#动态编译功能实现像Javascript中的Eval的功能来将一段字符串进行数学运算...

因为项目中有一个功能是由用户自己输入一个计算的表达式

如订单积分计算表达式:“{0} * 1.5 + 50”积分=订单金额 * 1.5倍 + 50积分

那么我的程序如何来计算出结果呢比如当前金额为100

那么表达式就为“100 * 1.5 +50”;

好以下测试代码

 

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;
using System.Globalization;


namespace Z.Shop.Test.AutoCompiler
{
[NUnit.Framework.TestFixture]
public class Test1
{
[NUnit.Framework.TestFixtureSetUp]
public void SetUp()
{
log4net.Config.XmlConfigurator.Configure(
new System.IO.FileInfo( " log4net.cfg.xml " ));
}

public double Eval( string expression)
{
CSharpCodeProvider objCSharpCodePrivoder
= new CSharpCodeProvider();
ICodeCompiler objICodeCompiler
= objCSharpCodePrivoder.CreateCompiler();
CompilerParameters objCompilerParameters
= new CompilerParameters();
objCompilerParameters.ReferencedAssemblies.Add(
" System.dll " );
objCompilerParameters.GenerateExecutable
= false ;
objCompilerParameters.GenerateInMemory
= true ;
// 这里为生成的动态代码
StringBuilder sb = new StringBuilder();
sb.Append(
" using System; " );
sb.Append(Environment.NewLine);
sb.Append(
" namespace DynamicCodeGenerate " );
sb.Append(Environment.NewLine);
sb.Append(
" { " );
sb.Append(Environment.NewLine);
sb.Append(
" public class DynamicCodeEval " );
sb.Append(Environment.NewLine);
sb.Append(
" { " );
sb.Append(Environment.NewLine);
sb.Append(
" public object Eval() " );
sb.Append(Environment.NewLine);
sb.Append(
" { " );
sb.Append(Environment.NewLine);
sb.Append(
" return " + expression + " ; " ); // 其实就是一个简单的表达式,如果要复杂的大家可以根据自己的情况改动
sb.Append(Environment.NewLine);
sb.Append(
" } " );
sb.Append(Environment.NewLine);
sb.Append(
" } " );
sb.Append(Environment.NewLine);
sb.Append(
" } " );

string code = sb.ToString();

CompilerResults cr
= objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, code);
// 这里是反射了
Assembly objAssembly = cr.CompiledAssembly;
object objDynamicCodeEval = objAssembly.CreateInstance( " DynamicCodeGenerate.DynamicCodeEval " );
MethodInfo objMI
= objDynamicCodeEval.GetType().GetMethod( " Eval " );
var result
= Convert.ToDouble(objMI.Invoke(objDynamicCodeEval, null ));
return result;
}

[NUnit.Framework.Test]
public void T1()
{
var result
= Eval( " 100 * 1.5 +50 " );
Console.Write(result.ToString());
}
}
}

 

 

执行结果:200

 

转载于:https://www.cnblogs.com/JerryBaxia/archive/2010/08/24/1807579.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值