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

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

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);        }
复制代码
本文转自齐师傅博客园博客,原文链接:http://www.cnblogs.com/youring2/archive/2012/12/17/2822104.html,如需转载请自行联系原作者
你可能感兴趣的文章
Git config 配置文件
查看>>
fopen函数mode模式说明以及与open函数区别
查看>>
好用的Flash滚动条
查看>>
Chrome浏览器录屏扩展插件
查看>>
django-response对象
查看>>
Flume架构
查看>>
设计模式之外观模式
查看>>
mysql之 mysql数据库压力测试工具(mysqlslap)
查看>>
戴尔PowerEdge RAID控制卡使用示例(PERC H710P为例)
查看>>
总结一下国内搞机器学习和数据挖掘的大牛
查看>>
c3p0使用
查看>>
自定义响应结构
查看>>
hadoop-2.2.0编译
查看>>
POJ2386 Lake Counting【DFS】
查看>>
CCF NOI1034 钞票兑换
查看>>
hashset和hashmap的区别
查看>>
用dx11检查你的硬件设备中有几个适配器(adapter)
查看>>
FloatinActionButton以及SnackBar的使用
查看>>
yii2.0高级模板归档文件windows7下安装
查看>>
centos 最小化安装pycharm
查看>>