随笔 - 49  文章 - 1 评论 - 44 阅读 - 39496
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

 using   System;  
  using   System.CodeDom.Compiler;  
  using   System.Reflection;  
  using   System.Text;  
  using   Microsoft.CSharp;  
   
  namespace   Expression  
  {  
          ///   <summary>  
          ///   计算表达式的类  
          ///   </summary>  
          public   class   CalculateExpression  
          {  
                  ///   <summary>  
                  ///   接受一个string类型的表达式并计算结果,返回一个object对象,静态方法  
                  ///   </summary>  
                  ///   <param   name="expression"></param>  
                  ///   <returns></returns>  
                  public   static   object   Calculate(string   expression)  
                  {  
                          string   className   =   "Calc";  
                          string   methodName   =   "Run";  
                          expression   =   expression.Replace("/",   "*1.0/");  
   
                          //   创建编译器实例。    
                          ICodeCompiler   complier   =   (new   CSharpCodeProvider().CreateCompiler());  
   
                          //   设置编译参数。    
                          CompilerParameters   paras   =   new   CompilerParameters();  
                          paras.GenerateExecutable   =   false;  
                          paras.GenerateInMemory   =   true;  
   
                          //   创建动态代码。    
                          StringBuilder   classSource   =   new   StringBuilder();  
                          classSource.Append("public   class   "   +   className   +   "\n");  
                          classSource.Append("{\n");  
                          classSource.Append("         public   object   "   +   methodName   +   "()\n");  
                          classSource.Append("         {\n");  
                          classSource.Append("                 return   "   +   expression   +   ";\n");  
                          classSource.Append("         }\n");  
                          classSource.Append("}");  
   
                          //   编译代码。    
                          CompilerResults   result   =   complier.CompileAssemblyFromSource(paras,   classSource.ToString());  
   
                          //   获取编译后的程序集。    
                          Assembly   assembly   =   result.CompiledAssembly;  
   
                          //   动态调用方法。    
                          object   eval   =   assembly.CreateInstance(className);  
                          MethodInfo   method   =   eval.GetType().GetMethod(methodName);  
                          object   reobj   =   method.Invoke(eval,   null);  
                          GC.Collect();  
                          return   reobj;  
                  }  
          }  
  }  
posted on   chinaprg  阅读(1558)  评论(1编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示