利用C#动态编译功能实现像Javascript中的Eval的功能来将一段字符串进行数学运算
2010-08-24 20:39
1056 查看
因为项目中有一个功能是由用户自己输入一个计算的表达式
如订单积分计算表达式:“{0} * 1.5 + 50”积分=订单金额 * 1.5倍 + 50积分
那么我的程序如何来计算出结果呢比如当前金额为100
那么表达式就为“100 * 1.5 +50”;
好以下测试代码
代码
执行结果:200
如订单积分计算表达式:“{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
相关文章推荐
- C#动态执行类库中的函数:利用反射实现(js)Eval,asp(Execute)功能
- C#利用反射实现(js)Eval,asp(Execute)功能 动态执行类库中的函数
- C#动态编译,实现按钮功能动态配置
- 利用附件上载控件+Javascript实现动态上传附件功能
- 利用JavaScript计算引擎进行字符串公式运算
- 在java中利用动态编译实现eval
- C#实现突破位数限制,用字符串对较大的数进行运算
- JavaScript_利用eval函数求字符串数学表达式的值
- 在java中利用动态编译实现eval
- 在java中利用动态编译实现eval
- C#下利用正则表达式实现字符串搜索功能的方法(转)
- Java中利用Interpreter动态编译实现eval
- java中调JavaScript的eval() 函数实现字符串的运算(ScriptEngineManger)
- c#中实现类似js的Eval|.NET中执行Javascript(表达式是字符串的计算)
- JavaScript基于DOM操作实现简单的数学运算功能示例
- c#利用反射,实现将model类变成字符串、再还原成mode对象的功能
- C#动态编译,实现按钮功能动态配置
- c#:实现动态编译,并实现动态MultiProcess功能(来自python multiprocess的想法)
- JavaScript基础 整形与字符串进行加法运算
- 在进行C#编程时候,有的时候我们需要判断一个字符串是否是数字字符串,我们可以通过以下两种方法来实现。 【方法一】:使用 try{} catch{} 语句。 我们可以在try语句块中试图