您的位置:首页 > Web前端 > JavaScript

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

2010-08-24 20:39 1056 查看
因为项目中有一个功能是由用户自己输入一个计算的表达式

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

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

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

好以下测试代码

代码

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: