国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
C# 將字符串解析運(yùn)算并返回結(jié)果

注:這里對(duì)于轉(zhuǎn)換成Demical,Float類(lèi)型暫時(shí)不成立(因?yàn)槿粢D(zhuǎn)成功,表達(dá)式里必須含有如Decimal: 0.2m, Float: 2.0f  這兩個(gè)暫時(shí)轉(zhuǎn)換不成功) 

 

/// <summary>   

    /// 本類(lèi)用來(lái)將字符串轉(zhuǎn)為可執(zhí)行文本并執(zhí)行   

    /// 從別處復(fù)制,勿隨意更改!   

    /// </summary>   

    public class Evaluator
    {

        #region 構(gòu)造函數(shù)

        /// <summary>   

        /// 可執(zhí)行串的構(gòu)造函數(shù)   

        /// </summary>   

        /// <param name="items">   

        /// 可執(zhí)行字符串?dāng)?shù)組   

        /// </param>   

        public Evaluator(EvaluatorItem[] items)
        {

            ConstructEvaluator(items);      //調(diào)用解析字符串構(gòu)造函數(shù)進(jìn)行解析   

        }

        /// <summary>   

        /// 可執(zhí)行串的構(gòu)造函數(shù)   

        /// </summary>   

        /// <param name="returnType">返回值類(lèi)型</param>   

        /// <param name="expression">執(zhí)行表達(dá)式</param>   

        /// <param name="name">執(zhí)行字符串名稱(chēng)</param>   

        public Evaluator(Type returnType, string expression, string name)
        {

            //創(chuàng)建可執(zhí)行字符串?dāng)?shù)組   

            EvaluatorItem[] items = { new EvaluatorItem(returnType, expression, name) };

            ConstructEvaluator(items);      //調(diào)用解析字符串構(gòu)造函數(shù)進(jìn)行解析   

        }

        /// <summary>   

        /// 可執(zhí)行串的構(gòu)造函數(shù)   

        /// </summary>   

        /// <param name="item">可執(zhí)行字符串項(xiàng)</param>   

        public Evaluator(EvaluatorItem item)
        {

            EvaluatorItem[] items = { item };//將可執(zhí)行字符串項(xiàng)轉(zhuǎn)為可執(zhí)行字符串項(xiàng)數(shù)組   

            ConstructEvaluator(items);      //調(diào)用解析字符串構(gòu)造函數(shù)進(jìn)行解析   

        }

        /// <summary>   

        /// 解析字符串構(gòu)造函數(shù)   

        /// </summary>   

        /// <param name="items">待解析字符串?dāng)?shù)組</param>   

        private void ConstructEvaluator(EvaluatorItem[] items)
        {

            //創(chuàng)建C#編譯器實(shí)例   

            ICodeCompiler comp = (new CSharpCodeProvider().CreateCompiler());

            //編譯器的傳入?yún)?shù)   

            CompilerParameters cp = new CompilerParameters();

 

            cp.ReferencedAssemblies.Add("system.dll");              //添加程序集 system.dll 的引用   

            cp.ReferencedAssemblies.Add("system.data.dll");         //添加程序集 system.data.dll 的引用   

            cp.ReferencedAssemblies.Add("system.xml.dll");          //添加程序集 system.xml.dll 的引用   

            cp.GenerateExecutable = false;                          //不生成可執(zhí)行文件   

            cp.GenerateInMemory = true;                             //在內(nèi)存中運(yùn)行   

 

            StringBuilder code = new StringBuilder();               //創(chuàng)建代碼串   

            /* 

             * 添加常見(jiàn)且必須的引用字符串 

             */

            code.Append("using System; \n");

            code.Append("using System.Data; \n");

            code.Append("using System.Data.SqlClient; \n");

            code.Append("using System.Data.OleDb; \n");

            code.Append("using System.Xml; \n");

 

            code.Append("namespace EvalGuy { \n");                  //生成代碼的命名空間為EvalGuy,和本代碼一樣   

 

            code.Append(" public class _Evaluator { \n");          //產(chǎn)生 _Evaluator 類(lèi),所有可執(zhí)行代碼均在此類(lèi)中運(yùn)行   

            foreach (EvaluatorItem item in items)               //遍歷每一個(gè)可執(zhí)行字符串項(xiàng)   
            {

                code.AppendFormat("    public {0} {1}() ",          //添加定義公共函數(shù)代碼   

                                  item.ReturnType.Name,             //函數(shù)返回值為可執(zhí)行字符串項(xiàng)中定義的返回值類(lèi)型   

                                  item.Name);                       //函數(shù)名稱(chēng)為可執(zhí)行字符串項(xiàng)中定義的執(zhí)行字符串名稱(chēng)   

                code.Append("{ ");                                  //添加函數(shù)開(kāi)始括號(hào)   

                code.AppendFormat("return ({0});", item.Expression);//添加函數(shù)體,返回可執(zhí)行字符串項(xiàng)中定義的表達(dá)式的值   

                code.Append("}\n");                                 //添加函數(shù)結(jié)束括號(hào)   

            }

            code.Append("} }");                                 //添加類(lèi)結(jié)束和命名空間結(jié)束括號(hào)   

 

            //得到編譯器實(shí)例的返回結(jié)果   

            CompilerResults cr = comp.CompileAssemblyFromSource(cp, code.ToString());

 

            if (cr.Errors.HasErrors)                            //如果有錯(cuò)誤   
            {

                StringBuilder error = new StringBuilder();          //創(chuàng)建錯(cuò)誤信息字符串   

                error.Append("編譯有錯(cuò)誤的表達(dá)式: ");                //添加錯(cuò)誤文本   

                foreach (CompilerError err in cr.Errors)            //遍歷每一個(gè)出現(xiàn)的編譯錯(cuò)誤   
                {

                    error.AppendFormat("{0}\n", err.ErrorText);     //添加進(jìn)錯(cuò)誤文本,每個(gè)錯(cuò)誤后換行   

                }

                throw new Exception("編譯錯(cuò)誤: " + error.ToString());//拋出異常   

            }

            Assembly a = cr.CompiledAssembly;                       //獲取編譯器實(shí)例的程序集   

            _Compiled = a.CreateInstance("EvalGuy._Evaluator");     //通過(guò)程序集查找并聲明 EvalGuy._Evaluator 的實(shí)例   

        }

        #endregion

 

        #region 公有成員

        /// <summary>   

        /// 執(zhí)行字符串并返回整型值   

        /// </summary>   

        /// <param name="name">執(zhí)行字符串名稱(chēng)</param>   

        /// <returns>執(zhí)行結(jié)果</returns>   

        public int EvaluateInt(string name)
        {
            return (int)Evaluate(name);
        }

        /// <summary>
        ///  執(zhí)行字符串并返回金額值   
        /// </summary>
        /// <param name="name">執(zhí)行字符串名稱(chēng)</param>
        /// <returns>執(zhí)行結(jié)果</returns>
        public double EvaluateDouble(string name)
        {
            return (double)Evaluate(name);
        }

        /// <summary>   

        /// 執(zhí)行字符串并返回字符串型值   

        /// </summary>   

        /// <param name="name">執(zhí)行字符串名稱(chēng)</param>   

        /// <returns>執(zhí)行結(jié)果</returns>   

        public string EvaluateString(string name)
        {

            return (string)Evaluate(name);

        }

        /// <summary>   

        /// 執(zhí)行字符串并返回布爾型值   

        /// </summary>   

        /// <param name="name">執(zhí)行字符串名稱(chēng)</param>   

        /// <returns>執(zhí)行結(jié)果</returns>   

        public bool EvaluateBool(string name)
        {

            return (bool)Evaluate(name);

        }

        /// <summary>   

        /// 執(zhí)行字符串并返 object 型值   

        /// </summary>   

        /// <param name="name">執(zhí)行字符串名稱(chēng)</param>   

        /// <returns>執(zhí)行結(jié)果</returns>   

        public object Evaluate(string name)
        {

            MethodInfo mi = _Compiled.GetType().GetMethod(name);//獲取 _Compiled 所屬類(lèi)型中名稱(chēng)為 name 的方法的引用   

            return mi.Invoke(_Compiled, null);                  //執(zhí)行 mi 所引用的方法   

        }

        #endregion

 

        #region 靜態(tài)成員

        /// <summary>   
        /// 執(zhí)行表達(dá)式并返回整型類(lèi)型值   
        /// </summary>   
        /// <param name="code">要執(zhí)行的表達(dá)式</param>   
        /// <returns>運(yùn)算結(jié)果</returns>   
        public static int EvaluateToInteger(string code)
        {

            Evaluator eval = new Evaluator(typeof(int), code, staticMethodName);//生成 Evaluator 類(lèi)的對(duì)像   

            return (int)eval.Evaluate(staticMethodName);                        //執(zhí)行并返回整型數(shù)據(jù)   

        }
        /// <summary>   
        /// 執(zhí)行表達(dá)式并返回金額類(lèi)型值   
        /// </summary>   
        /// <param name="code">要執(zhí)行的表達(dá)式</param>   
        /// <returns>運(yùn)算結(jié)果</returns>  
        public static double EvaluateToDouble(string code)
        {
            Evaluator eval = new Evaluator(typeof(double), code, staticMethodName);//生成 Evaluator 類(lèi)的對(duì)像   

            return (double)eval.Evaluate(staticMethodName);                        //執(zhí)行并返回整型數(shù)據(jù)   
        }

        /// <summary>   
        /// 執(zhí)行表達(dá)式并返回字符串型值   
        /// </summary>   
        /// <param name="code">要執(zhí)行的表達(dá)式</param>   
        /// <returns>運(yùn)算結(jié)果</returns>   
        public static string EvaluateToString(string code)
        {

            Evaluator eval = new Evaluator(typeof(string), code, staticMethodName);//生成 Evaluator 類(lèi)的對(duì)像   

            return (string)eval.Evaluate(staticMethodName);                     //執(zhí)行并返回字符串型數(shù)據(jù)   

        }

        /// <summary>   

        /// 執(zhí)行表達(dá)式并返回布爾型值   

        /// </summary>   

        /// <param name="code">要執(zhí)行的表達(dá)式</param>   

        /// <returns>運(yùn)算結(jié)果</returns>   

        public static bool EvaluateToBool(string code)
        {

            Evaluator eval = new Evaluator(typeof(bool), code, staticMethodName);//生成 Evaluator 類(lèi)的對(duì)像   

            return (bool)eval.Evaluate(staticMethodName);                       //執(zhí)行并返回布爾型數(shù)據(jù)   

        }

        /// <summary>   

        /// 執(zhí)行表達(dá)式并返回 object 型值   

        /// </summary>   

        /// <param name="code">要執(zhí)行的表達(dá)式</param>   

        /// <returns>運(yùn)算結(jié)果</returns>   

        public static object EvaluateToObject(string code)
        {

            Evaluator eval = new Evaluator(typeof(object), code, staticMethodName);//生成 Evaluator 類(lèi)的對(duì)像   

            return eval.Evaluate(staticMethodName);                             //執(zhí)行并返回 object 型數(shù)據(jù)   

        }

        #endregion

 

        #region 私有成員

        /// <summary>   

        /// 靜態(tài)方法的執(zhí)行字符串名稱(chēng)   

        /// </summary>   

        private const string staticMethodName = "__foo";

        /// <summary>   

        /// 用于動(dòng)態(tài)引用生成的類(lèi),執(zhí)行其內(nèi)部包含的可執(zhí)行字符串   

        /// </summary>   

        object _Compiled = null;

        #endregion

    }

    /// <summary>   

    /// 可執(zhí)行字符串項(xiàng)(即一條可執(zhí)行字符串)   

    /// </summary>   

    public class EvaluatorItem
    {

        /// <summary>   

        /// 返回值類(lèi)型   

        /// </summary>   

        public Type ReturnType;

        /// <summary>   

        /// 執(zhí)行表達(dá)式   

        /// </summary>   

        public string Expression;

        /// <summary>   

        /// 執(zhí)行字符串名稱(chēng)   

        /// </summary>   

        public string Name;

        /// <summary>   

        /// 可執(zhí)行字符串項(xiàng)構(gòu)造函數(shù)   

        /// </summary>   

        /// <param name="returnType">返回值類(lèi)型</param>   

        /// <param name="expression">執(zhí)行表達(dá)式</param>   

        /// <param name="name">執(zhí)行字符串名稱(chēng)</param>   

        public EvaluatorItem(Type returnType, string expression, string name)
        {

            ReturnType = returnType;

            Expression = expression;

            Name = name;

        }

 

        //調(diào)用方法:注意引用EvalGuy命名空間:

        #region

        //Console.WriteLine("Test0: {0}", Evaluator.EvaluateToInteger("(30 + 4) * 2"));   

        //Console.WriteLine("Test1: {0}", Evaluator.EvaluateToString("\"Hello \" + \"There\""));   

        //Console.WriteLine("Test2: {0}", Evaluator.EvaluateToBool("30 == 40"));   

        //Console.WriteLine("Test3: {0}", Evaluator.EvaluateToObject("new DataSet()"));   
        //EvaluatorItem[] items = {   

        //                          new EvaluatorItem(typeof(int), "(30 + 4) * 2", "GetNumber"),   

        //                          new EvaluatorItem(typeof(string), "\"Hello \" + \"There\"",    

        //                                                            "GetString"),   

        //                          new EvaluatorItem(typeof(bool), "30 == 40", "GetBool"),   

        //                          new EvaluatorItem(typeof(object), "new DataSet()", "GetDataSet")   

        //                        };   


        //Evaluator eval = new Evaluator(items);   

        //Console.WriteLine("TestStatic0: {0}", eval.EvaluateInt("GetNumber"));   

        //Console.WriteLine("TestStatic1: {0}", eval.EvaluateString("GetString"));   

        //Console.WriteLine("TestStatic2: {0}", eval.EvaluateBool("GetBool"));   

        //Console.WriteLine("TestStatic3: {0}", eval.Evaluate("GetDataSet")); 

        #endregion

    }

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
LoadRunner字符串與參數(shù)的操作及轉(zhuǎn)換技巧
Runtime C# Expression Evaluator
C# 后臺(tái)判斷一個(gè)字符串是否為整數(shù)或者帶兩位小數(shù)的數(shù)字
【開(kāi)源原創(chuàng)】.NET開(kāi)源表達(dá)式計(jì)算組件介紹與使用
C#正則表達(dá)式判斷輸入日期格式是否正確
C# 登錄簡(jiǎn)單網(wǎng)站嘗試 — Windows Live
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服