由于程序需要,计算的表达式使用字符串传输,这样对运算造成了影响。在程序中直接执行这段表达式可以得到值,

但是使用字符串就没有办法运算了,

所以想到用CodeDOM将这段字符串拼接在代码中编译

类似string str="1>0";  需要返回True,同样也是用这种方式

  1. using System;
  2. using System.CodeDom.Compiler;
  3. using System.Reflection;
  4. using System.Text;
  5. using Microsoft.CSharp;
  6.  
  7. namespace Test
  8. {
  9. public class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. string text ="Math.Pow(Math.Sqrt(((2.08 * 0.2 + 1.82 * 0.2 + 2.02 * 0.2 + Math.Sqrt(3.08) * 0.1 + 2.18 * 0.1 + Math.Log10(2.13 * 0.1 + 2.13 * 0.1)) / 5) * 100),3)";
  14.  
  15. // 1.CSharpCodePrivoder
  16. CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();
  17.  
  18. // 2.ICodeComplier
  19. ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler();
  20.  
  21. // 3.CompilerParameters
  22. CompilerParameters objCompilerParameters = new CompilerParameters();
  23. objCompilerParameters.ReferencedAssemblies.Add("System.dll");
  24. objCompilerParameters.GenerateExecutable = false;
  25. objCompilerParameters.GenerateInMemory = true;
  26.  
  27. // 4.CompilerResults
  28. CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, GenerateCode(text));
  29.  
  30. if (cr.Errors.HasErrors)
  31. {
  32. Console.WriteLine("编译错误:");
  33. foreach (CompilerError err in cr.Errors)
  34. {
  35. Console.WriteLine(err.ErrorText);
  36. }
  37. }
  38. else
  39. {
  40. // 通过反射,调用HelloWorld的实例
  41. Assembly objAssembly = cr.CompiledAssembly;
  42. object objHelloWorld = objAssembly.CreateInstance("DynamicCodeGenerate.HelloWorld");
  43. MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut");
  44.  
  45. Console.WriteLine(objMI.Invoke(objHelloWorld, null));
  46. }
  47.  
  48. Console.ReadLine();
  49. }
  50.  
  51. static string GenerateCode(string abc)
  52. {
  53. StringBuilder sb = new StringBuilder();
  54. sb.Append("using System;");
  55. sb.Append(Environment.NewLine);
  56. sb.Append("namespace DynamicCodeGenerate");
  57. sb.Append(Environment.NewLine);
  58. sb.Append("{");
  59. sb.Append(Environment.NewLine);
  60. sb.Append(" public class HelloWorld");
  61. sb.Append(Environment.NewLine);
  62. sb.Append(" {");
  63. sb.Append(Environment.NewLine);
  64. sb.Append(" public string OutPut()");
  65. sb.Append(Environment.NewLine);
  66. sb.Append(" {");
  67. sb.Append(Environment.NewLine);
  68. sb.Append(string.Format(" return {0}+\"\";",abc));
  69. sb.Append(Environment.NewLine);
  70. sb.Append(" }");
  71. sb.Append(Environment.NewLine);
  72. sb.Append(" }");
  73. sb.Append(Environment.NewLine);
  74. sb.Append("}");
  75.  
  76. string code = sb.ToString();
  77. Console.WriteLine(code);
  78. Console.WriteLine();
  79.  
  80. return code;
  81. }
  82. }
  83. }

代码

使用CodeDOM动态编译一个字符串表达式的更多相关文章

  1. golang 一个字符串表达式替换的函数

    package util import ( "fmt" "reflect" "regexp" "strconv" &qu ...

  2. JIT(动态编译)和AOT(静态编译)编译技术比较

    Java 应用程序的性能经常成为开发社区中的讨论热点.因为该语言的设计初衷是使用解释的方式支持应用程序的可移植性目标,早期 Java 运行时所提供的性能级别远低于 C 和 C++ 之类的编译语言.尽管 ...

  3. java动态编译类文件并加载到内存中

    如果你想在动态编译并加载了class后,能够用hibernate的数据访问接口以面向对象的方式来操作该class类,请参考这篇博文-http://www.cnblogs.com/anai/p/4270 ...

  4. .Net 动态编译(c# 脚本)

    1 用.NET提供的类动态编译代码字符串,生成DLL存于内存中,加载到程序域 2 用反射的方式调用这个DLL 将要被编译和执行的代码读入并以字符串方式保存声明CSharpCodeProvider对象实 ...

  5. 【.net 深呼吸】细说CodeDom(9):动态编译

    知道了如果构建代码文档,知道了如何生成代码,那么编译程序集就很简单了. CodeDomProvider 类提供了三个可以执行编译的方法: 1.CompileAssemblyFromSource——这个 ...

  6. C#动态编译代码,执行一个代码片段,或者从指定文件中加载某个接口的实现类

    在项目进行中有时候会需要配置一些复杂的表达式,在程序运行的时候执行表达式,根据结果执行相应的操作,简单写了一个类Expression,利用.net的动态编译技术实现,代码如下: public clas ...

  7. 函数-->指定函数--->默认函数--->动态函数--> 动态参数实现字符串格式化-->lambda表达式,简单函数的表示

    #一个函数何以接受多个参数#无参数#show(): ---> 执行:show() #传入一个参数 def show(arg): print(arg) #执行 show(123) #传入两个参数 ...

  8. 在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式

    在进行项目开发的时候,刚好需要用到对字符串表达式进行求值的处理场景,因此寻找了几个符合要求的第三方组件LambdaParser.DynamicExpresso.Z.Expressions,它们各自功能 ...

  9. divmod(a,b)函数是实现a除以b,然后返回商与余数的元组、eval可以执行一个字符串形式的表达式、exec语句用来执行储存在字符串或文件中的Python语句

    #!/usr/bin/env python a = 10/3 print(a) #divmod计算商与余数 r = divmod(10001,20) print(r) #eval可以执行一个字符串形式 ...

随机推荐

  1. html5,js插件实现手机端实现头像剪切上传

    思路:先打开相册,选取图片,在剪切图片,转化为base64格式,然后上传到七牛存储,返回url,再传给后端,整个流程就是这样.用的是angular框架,图像插件用到imagecropper.js,废话 ...

  2. 贴片晶振跟随WIFI渗透到我们的生活之中

    在用WIFI上网的时候很多时候会遇到上网速度不是慢就是卡,甚至是连接不上更气人的就是有时候会识别不了.我最常遇到的就是连接不上去,玩着玩着就玩不了了.起初我不知道这是什么原因,但是从事晶振行业之后我慢 ...

  3. swift MBProgressHUD加载gif或者apng的动图

    效果图 给MBProgressHUD添加一个分类(extension) extension MBProgressHUD { /// MBProgressHUD 显示加载gif hud方法 /// // ...

  4. React源码学习——ReactClass

    前言 之前一直在使用react做开发,但是对其内部的工作机制却一点儿都不了解,说白了就是一直在套api,毫无成就感.趁最近比较闲,对源码做了一番研究,并通过博客的方式做一些记录. 进入正题 通过编写自 ...

  5. .net 非对称加密

    后台   public class RSAHelper     {         /// <summary>         /// RSA加密         /// </sum ...

  6. js继承之借用构造函数继承

    我的上一篇文章介绍了,原型链继承模式.但是单纯的原型链模式并不能很好地实现继承. 一.原型链的缺点 1.1 单纯的原型链继承最大的一个缺点,来自于原型中包含引用类型的值. 本来,我们没有通过原型链实现 ...

  7. JavaScript数组去重方法及测试结果

    最近看到一些人的去面试web前端,都说碰到过问JavaScript数组去重的问题,我也学习了一下做下总结. 实际上最有代表性也就三种方法:数组双重循环,对象哈希,排序后去重. 这三种方法我都做了性能测 ...

  8. require 增量更新与版本管理

    使用require.js 加载JS文件时,当JS文件有更新,可以通过更改全局版本号( urlArgs : 'v=1'),告诉浏览器加载新的文件. 但该方法虽然使用方便,但美中不足的是有些不需要更新的文 ...

  9. node.js零基础详细教程(5):express 、 路由

    第五章 建议学习时间4小时  课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑. ...

  10. Vue的报错:Uncaught TypeError: Cannot assign to read only property 'exports' of object '#<Object>'

    Vue的报错:Uncaught TypeError: Cannot assign to read only property 'exports' of object '#<Object>' ...