博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#动态编译计算表达式的值
阅读量:5891 次
发布时间:2019-06-19

本文共 2778 字,大约阅读时间需要 9 分钟。

C#动态编译计算表达式的值,是通过System.CodeDom.Compiler命名空间下的相关类来实现的。其步骤大致为:

1.将表达式包装成为可编译的C#代码

2.使用反射调用上一步编译的代码。

示例如下:在界面上放一个TextBox,用来输入表达式;放一个按钮,用来相应用户点击,以进行表达式的计算;在另外一个TextBox中显示计算结果。对应的xaml代码如下:

在后台代码中,首先添加一下引用:

using Microsoft.CSharp;using System.CodeDom.Compiler;using System.Reflection;

剩余的代码如下:

private void Window_Loaded(object sender, RoutedEventArgs e)        {            this.txtExpression.Focus();        }        private void btnCalculate_Click(object sender, RoutedEventArgs e)        {            try            {                string expression = this.txtExpression.Text.Trim();                this.txtResult.Text = this.ComplierCode(expression).ToString();            }            catch (Exception ex)            {                this.txtResult.Text = ex.Message;            }        }        private object ComplierCode(string expression)        {            string code = WrapExpression(expression);            CSharpCodeProvider csharpCodeProvider = new CSharpCodeProvider();            //编译的参数            CompilerParameters compilerParameters = new CompilerParameters();            //compilerParameters.ReferencedAssemblies.AddRange();            compilerParameters.CompilerOptions = "/t:library";            compilerParameters.GenerateInMemory = true;            //开始编译            CompilerResults compilerResults = csharpCodeProvider.CompileAssemblyFromSource(compilerParameters, code);            if (compilerResults.Errors.Count > 0)                throw new Exception("编译出错!");            Assembly assembly = compilerResults.CompiledAssembly;            Type type = assembly.GetType("ExpressionCalculate");            MethodInfo method = type.GetMethod("Calculate");            return method.Invoke(null, null);        }        private string WrapExpression(string expression)        {            string code = @"                using System;                class ExpressionCalculate                {                    public static DateTime start_dt = Convert.ToDateTime(""{start_dt}"");                    public static DateTime end_dt = Convert.ToDateTime(""{end_dt}"");                    public static DateTime current_dt = DateTime.Now;                    public static object Calculate()                    {                        return {0};                    }                }            ";            return code.Replace("{0}", expression);        }

简单的说明一下,WrapExpression方法用来包装表达式,使其可以被代码编译器编译通过。ComplierCode方法用来编译,并通过反射执行代码。其它是两个事件的处理方法,无需多说。

在上面的示例中可以实现动态计算符合C#语法的数学表达式计算。

 

如果认为此文对您有帮助,别忘了支持一下哦!

作者:
来源:
声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未授权,贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。
转载:http://www.cnblogs.com/youring2/archive/2012/12/17/2822104.html
你可能感兴趣的文章
[HDFS]HDFS优化-小文件合并.md
查看>>
公司组网核心、汇聚、接入层交换机配置
查看>>
一个IO的传奇一生(2)
查看>>
linux文件描述符
查看>>
C++ const 详解
查看>>
给Github上的项目添加开源协议
查看>>
imx53 start board 开箱照
查看>>
免费的编程中文书籍索引
查看>>
struts2引入标签时遇到的问题
查看>>
Hibernate例子-自己写的一个干净的给予注解的Hibernate例子
查看>>
WorkFlow入门Step.6—Building a Console Application -For-WF4.0
查看>>
sota系统服务进程的启动与停止(章节:4.2)
查看>>
几个比喻让你彻底明白什么是HTML5
查看>>
Linux基础环境准备
查看>>
JS调用agent的方法
查看>>
4、Bash基础及配置、标准I/O、管道及shell编程基础;
查看>>
综合技术 --mybatis-config.xml文件
查看>>
Java的缓冲流内部实现及其效率探讨
查看>>
mysql+mycat实现读写分离
查看>>
http协议特点,web资源,url通用格式
查看>>