CodeDomProvider 反射机制生成计算函数

来源:互联网 发布:苏州碟科数据恢复中心 编辑:程序博客网 时间:2024/06/10 00:05

 

using System;using System.Text;//编译器using System.CodeDom.Compiler;//反射using System.Reflection;namespace TestRunSpeed{    public class Evaluator    {        //创建编译类对象        private object _Compiled = null;        //构造函数        public Evaluator()        {            ConstructEvaluator();        }        /// <summary>        /// 使用编译器创建类        /// </summary>        public void ConstructEvaluator()        {            //创建编译器 对象并实例化。使用语言为 CSharp            CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");            //调用编译器的参数            CompilerParameters cp = new CompilerParameters();            //添加引用            cp.ReferencedAssemblies.Add("system.dll");            //不生成可执行文件            cp.GenerateExecutable = false;            //不在内存中生成输出            cp.GenerateInMemory = false;            //创建代码串            StringBuilder code = new StringBuilder();            code.Append("using System;/n");            code.Append("namespace TestRunSpeed { /n");            code.Append("public class _Evaluator { /n");            code.Append("public double GetResult(double d1, double d2, double d3, double d4, double d5 , double d6) { /n");            code.Append("return d1 * Math.Pow(d2, d3) / d4 + d5 - d6; /n");            code.Append("}}}");            //返回编译结果            CompilerResults cr = provider.CompileAssemblyFromSource(cp, code.ToString());            //判断是否存在错误或者警告            if (cr.Errors.HasErrors)            {                //创建字符串对象                StringBuilder error = new StringBuilder();                                //循环遍历错误和警告,将错误信息保存到字符串对象中                error.Append("Error Compiling Expression: ");                foreach (CompilerError err in cr.Errors)                {                    error.AppendFormat("{0}/n", err.ErrorText);                }                //抛出异常                throw new Exception("Error Compiling Expression: " + error);            }            //获取编译好的程序集            Assembly assembly = cr.CompiledAssembly;            //创建编译类的引用            _Compiled = assembly.CreateInstance("TestRunSpeed._Evaluator");        }        public object Evaluate(params object[] d)        {            //在编译类中,根据方法名获取此方法            MethodInfo mi = _Compiled.GetType().GetMethod("GetResult");            //根据传入参数执行方法并返回结果            return mi.Invoke(_Compiled, d);        }    }} //程序中调用Evaluator ce = new Evaluator();double c = double.Parse(ce.Evaluate(3.14, 99.85, 1.33, 25.9854, 22.78, 22.45).ToString());