使用反射执行一个字符串表达式

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

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

所以想到用反射将这段字符串拼接在代码中执行

 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 }

代码

时间: 2024-08-11 03:35:23

使用反射执行一个字符串表达式的相关文章

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

1 #!/usr/bin/env python 2 a = 10/3 3 print(a) 4 #divmod计算商与余数 5 r = divmod(10001,20) 6 print(r) 7 #eval可以执行一个字符串形式的表达式 8 ret = eval("1 + 3") 9 c = eval("a + 60",{"a": 99}) 10 print(ret) 11 print(c) 12 """exec语句

使用Python运算一个字符串表达式

概述: 如何运行一个表达式,例如:12+23*4/2这个我想大家都很了解.不过,如果这个表达式是一个字符串呢?或是这样来描述,一个表达式被写成了一个字符串,我们又应该如何去运行并求得值呢?你是否会想,如果我们能够拿到12, 23, 4, 2以及中间的运算符,那就是真的太好了.而事实上,我们也正是在朝着这个方向去努力.如果你学过算法或是数据结构,那我想这个小问题便不会阻止你前进了. 思路分析: 如概述所说,如果我们能拿到字符串表达式中中各个我们肉眼能够识别的"元素",就算我们迈过了第一步

C#中分别对委托、匿名方法、Lambda表达式、Lambda表达式树以及反射执行同一方法的过程进行比较。

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; using System.Linq.Expressions; namespace INPEXOne.LearnCS { class RefletLambdaDelegate { static object[] para

C# 通过反射执行已存在于类中的方法 通过字符串执行方法

通过字符串执行方法,在可能会调用不同方法时对不同方法进行调用 以下为实例: 1 public class ABC 2 { 3 string str = "通过反射执行的方法"; 4 //Class:要反射的Method所在类名 5 Type type = typeof(Class); 6 //funcName:进行反射的方法名称,第二个参数指定方法的搜索范围,当前为搜索private的方法,没有第二个参数则为public的方法 7 MethodInfo mt = type.GetMet

笔记:IIFE 立即执行的函数表达式 +function ($) { }(window.jQuery);

在Bootstrap源码(具体请看<Bootstrap源码解析1>)和其他jQuery插件经常看到如下的写法: +function ($) { }(window.jQuery); 这种写法称为:IIFE 2(Imdiately InvokedFunction Expression 立即执行的函数表达式). 解析: 先弄清函数表达式(function expression)3和 函数声明(function declaration)的区别: 函数表达式  var test = function()

反射调用与Lambda表达式调用

想调用一个方法很容易,直接代码调用就行,这人人都会.其次呢,还可以使用反射.不过通过反射调用的性能会远远低于直接调用——至少从绝对时间上来看的确是这样.虽然这是个众所周知的现象,我们还是来写个程序来验证一下.比如我们现在新建一个Console应用程序,编写一个最简单的Call方法. class Program { static void Main(string[] args) { } public void Call(object o1, object o2, object o3) { } }

PHP 实现字符串表达式计算

什么是字符串表达式?即,将我们常见的表达式文本写到了字符串中,如:"$age >= 20",$age 的值是动态的整型变量. 什么是字符串表达式计算?即,我们需要一段程序来执行动态的表达式,如给定一个含表达式的字符串变量并计算其结果,而表达式字符串是动态的,比如为客户A执行的表达式是 $orderCount >= 10,而为客户B执行的表达式是 $orderTotal >= 1000. 场景在哪儿?同一份程序具有完全通用性,但差异就其中一个表达式而已,那么我们需要将其

Sql Server 中将由逗号“,”分割的一个字符串转换为一个表集,并应用到 in 条件中

Sql Server 中将由逗号","分割的一个字符串,转换为一个表,并应用与 in 条件 select * from tablenmae where id in(1,2,3) 这样的语句和常用,但是如果in 后面的 1,2,3是变量怎么办呢,一般会用字符串连接的方式构造sql语句 string aa="1,2,3"; string sqltxt="select * from tablename where id in ("+aa+")

用c语言实现 计算一个字符串中单词的个数

#include<stdio.h> int main() { char string[100]; int i , num=0 ,word=0; char c; gets(string);//从键盘得到一个字符串 for(i=0;(c=string[i])!='\0';i++)//字符不是'\0'就执行循环 { if(c==' ')//遇到空格word置0 { word=0; } else if(word==0)//未遇到空格且word为0则num加一且word置1 { word=1; num+