[C#] C#将字符串转换成表达式执行输出运算结果的代码 →→→→→进入此内容的聊天室

来自 , 2020-08-31, 写在 C#, 查看 150 次.
URL http://www.code666.cn/view/82ba9d6e
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4.  
  5. using System.CodeDom.Compiler;//这个命名空间不要忘了  
  6. using System.Reflection;  
  7.  
  8. namespace Common.Doing  
  9. {  
  10.     /// <summary>  
  11.     /// 动态求值  
  12.     /// </summary>  
  13.     public class Evaluator  
  14.     {  
  15.         /// <summary>  
  16.         /// 计算结果,如果表达式出错则抛出异常  
  17.         /// </summary>  
  18.         /// <param name="statement">表达式,如"1+2+3+4"</param>  
  19.         /// <returns>结果</returns>  
  20.         public static object Eval(string statement)  
  21.         {  
  22.             //调用实例化后的对象的方法,注意:第一个参数必须为JScript源代码里的方法。且所传字符串里的运算规则或方法也必须为JScript所支持  
  23.             return _evaluatorType.InvokeMember(  
  24.                         "Eval",  
  25.                         BindingFlags.InvokeMethod,  
  26.                         null,  
  27.                         _evaluator,  
  28.                         new object[] { statement }  
  29.                      );  
  30.         }  
  31.  
  32.         static Evaluator()  
  33.         {  
  34.             //构造JScript的编译驱动代码,该语言必须为.net支持的语言,根据语言名称驱动对应的编译器  
  35.             CodeDomProvider provider = CodeDomProvider.CreateProvider("JScript");  
  36.             //设置调用编译器的参数,下面参数设置编译器将程序集输出到内存。  
  37.             CompilerParameters parameters;  
  38.             parameters = new CompilerParameters();  
  39.             parameters.GenerateInMemory = true;  
  40.             //根据设置的编译器参数对语言源代码进行编译  
  41.             CompilerResults results;  
  42.             results = provider.CompileAssemblyFromSource(parameters, _jscriptSource);  
  43.             //获取编译好的程序集  
  44.             Assembly assembly = results.CompiledAssembly;  
  45.             //获取程序集后,使用反射获取程序集中的类  
  46.             _evaluatorType = assembly.GetType("Evaluator");  
  47.             //创建获取到的类的实例  
  48.             _evaluator = Activator.CreateInstance(_evaluatorType);  
  49.         }  
  50.  
  51.         private static object _evaluator = null;  
  52.         private static Type _evaluatorType = null;  
  53.  
  54.         /// <summary>  
  55.         /// JScript语言源代码。即你想要被编译的源代码,这个代码里包含了字符串参数中方法或规则。  
  56.         /// </summary>  
  57.         private static readonly string _jscriptSource =  
  58.             @" import SharpDll;  
  59.                class Evaluator  
  60.               {  
  61.                   public function Eval(expr : String) : String  
  62.                   {  
  63.                      return eval(expr);  
  64.                   }  
  65.                public function RoundUp(numVar:double,len:int):double  
  66.                {  //var dindex:int = numVar.ToString().IndexOf(" + "\".\"" + @");  
  67.                   //return double.Parse(numVar.ToString().Substring(0,dindex))+ 1;  
  68.                    var numRev:double = 0;  
  69.                    var dindex:int = numVar.ToString().IndexOf("+"\".\""+ @");  
  70.                    if (dindex> -1)  
  71.                    {  
  72.                        if (len == 0)  
  73.                        {  
  74.                            if (int.Parse(numVar.ToString().Substring(dindex+1))> 0)  
  75.                            {  
  76.                                numRev = double.Parse(numVar.ToString().Substring(0,dindex))+ 1;  
  77.                            }  
  78.                        }  
  79.                        if (len > 0)  
  80.                        {  
  81.                            if ((dindex + len) > numVar.ToString().Substring(dindex).Length)  
  82.                            {  
  83.                                numRev = numVar;  
  84.                            }  
  85.                            else  
  86.                            {  
  87.                                if (int.Parse(numVar.ToString().Substring(dindex + len+1)) > 0)  
  88.                                {  
  89.                                    var tempnum:double = double.Parse(numVar.ToString().Substring(0,dindex+len+1)) * invokeIn(len)+1;  
  90.                                    numRev = double.Parse(tempnum.ToString().Insert(tempnum.ToString().Length - len, " + "\".\"" + @"));  
  91.                                }  
  92.                                else  
  93.                                {  
  94.                                    numRev = double.Parse(numVar.ToString().Substring(0, dindex + len));  
  95.                                }  
  96.                            }  
  97.                        }  
  98.                    }  
  99.                    else  
  100.                    {  
  101.                        numRev = numVar;  
  102.                    }  
  103.                    return numRev;  
  104.                }  
  105.                public function invokeInt(len:int):int  
  106.                {  
  107.                    var TempVal:String = "+"\"1\""+ @";  
  108.                    var i:int = 0;  
  109.                    while(i<len)  
  110.                    {  
  111.                        TempVal = TempVal+" + "\"0\"" + @";  
  112.                        i++;  
  113.                    }  
  114.                    return int.Parse(TempVal);  
  115.                }  
  116.               }";  
  117.     }  
  118. }
  119.  
  120.  
  121. //csharp/7131

回复 "C#将字符串转换成表达式执行输出运算结果的代码"

这儿你可以回复上面这条便签

captcha