winform计算器

引言

本次项目目的主要为了熟悉winform控件使用,以及学习Microsoft.CSharp的使用。

技术栈

C# winform

实现效果

 

设计与实现

按键使用button空间,计算算式以及计算结果使用label控件。运算核心使用Microsoft.CSharp,利用C#动态编译特性,将算式转换成源码,交给编译器计算。


               //算式运算代码
        public static double EvaluateExpression(string expression)
        {
            CSharpCodeProvider provider = new CSharpCodeProvider();//提供编译源码的方法
            CompilerParameters parameters = new CompilerParameters();//提供编译过程中的各种参数
            parameters.GenerateInMemory = true;//不生成物理文件,使用内存
            //动态编译时需要指向它所需要的库
            parameters.ReferencedAssemblies.Add("mscorlib.dll");
            parameters.ReferencedAssemblies.Add("System.Core.dll");
            //CompilerResults存储编译后的结果
            //@后定义的是c#源码
            //编译器会将源码执行,自动进行算术运算,返回expression的结果
            CompilerResults results = provider.CompileAssemblyFromSource(parameters, @"
            using System;
            public class ExpressionEvaluator
            {
                public static double Evaluate()
                {
                    return " + expression + @";
                }
            }");
            //编译出错返回
            if (results.Errors.HasErrors)
            {
                throw new ArgumentException("Error compiling expression.", nameof(expression));
            }
            //通过反射获取程序集中的ExpressionEvaluator
            Type evaluatorType = results.CompiledAssembly.GetType("ExpressionEvaluator");
            //获取"Evaluate"方法
            MethodInfo methodInfo = evaluatorType.GetMethod("Evaluate");
            //返回结果(第一个null表示:调用静态方法,第二个null表示:方法没有参数)
            return (double)methodInfo.Invoke(null, null);
        }
            

挑战与解决方案

原本想要直接将算式String分解,一步一步运算,但是太麻烦,所以采用Microsoft.CSharp

 

 

posted @ 2024-08-02 13:37  =·~·=  阅读(18)  评论(0编辑  收藏  举报