91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MethodCallExpression和Expression.Compile()正確的使用方法

發布時間:2021-06-29 14:48:20 來源:億速云 閱讀:644 作者:chen 欄目:編程語言

這篇文章主要介紹“MethodCallExpression和Expression.Compile()正確的使用方法”,在日常操作中,相信很多人在MethodCallExpression和Expression.Compile()正確的使用方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MethodCallExpression和Expression.Compile()正確的使用方法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

            Expression<Func<int,int>> expmethod = ep=>ep+50;            
            //LambdaExpression lbda = Expression.Lambda<Func<int,int>>(expmethod.Body,Expression.Parameter(typeof(int)));
            //var lbdadel = lbda.Compile();
            //Console.WriteLine("Expression<Func<int,int>> expmethod = ep=>ep+50 = " + lbdadel.Invoke(4));//.DynamicInvoke(4));
            //結果運行時發現:
            //var lbdadel = lbda.Compile();這一句出現:System.InvalidoperationException類型的未經處理的異常在System.Core.dll中發生
            //其他信息:從作用域""引用了"System.Int32"類型的變量"ep",但該變量未定義

            //其實這樣將Expression<Func<...>> exp = ep=>ep+50;這種表達式再用Expression.Lambda(...)創建Lambda表達式的做法是不正確的,
            //因為Expression<Func<...>> exp = ep=>ep+50 所定義的exp本來就是一個LambdaExpression,這個時候只能用LambdaExpression類
            //的Compile()直接進行編譯才是正確的做法
            var lbdadel = expmethod.Compile();
            Console.WriteLine("Expression<Func<int,int>> expmethod = ep=>ep+50 = " + lbdadel.DynamicInvoke(4));

以上作法是針對Expression<Func/Action>> exp = exp=>xxxxxx;這種形式的表達式進行Compile()再進行調用從而得出結果值,如果是一個類中的方法,我有這個類的對象變量,如何通過表達式形式進行調用呢?

class ClassMethodCallExpression:IMethodCallExpression
    {

        public int methodfun(int arg) //接口中的方法的實現
        {
            return arg + 5;
        }
    }

IMethodCallExpression imce = new ClassMethodCallExpression();
            //Func<MethodCallExpression,int> exp = (ex=>ex.methodfun)
            //MethodInfo無法new出來對象,怎么創建一個MethodInfo呢???
            MethodInfo mi = typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) });
            ConstantExpression ce = Expression.Constant("3");
            MethodCallExpression mce = Expression.Call(mi, ce);//針對靜態方法
            Action a = Expression.Lambda<Action>(mce).Compile();  
            a();//也就是Console.WriteLine方法的執行

            MethodInfo mi2 = typeof(ClassMethodCallExpression).GetMethod("methodfun",new Type[]{typeof(int)});
            ConstantExpression ce2 = Expression.Constant(5);
            MethodCallExpression mce2 = Expression.Call(Expression.Constant(imce),mi2, ce2);//針對非靜態方法
            //Expression.Call方法中,無Expression instance則表示將調用的是靜態方法
            //當MehtodCallExpression準備調用實例方法時,可以通過Expression.Constant(實例對象變量)創建ConstantExpression,然后將這個ConstantExpression當作instance傳參
            //具體以及更復雜的例子參考 https://blog.csdn.net/weixin_34402090/article/details/85786004
            // MethodCallExpression Expression.Call(Expression instance,MehtodInfo,params Expression[] arguments)或者
            //Expression.Call(MehtodInfo,params Expression[])
            var a2 = Expression.Lambda<Func<int>>(mce2).Compile();
            //MethodCallExpression使用步驟(如果是靜態方法當然不需要目標對象變量)
            //1:定義好要用到的目標對象變量(因為最終要執行的方法在它所屬的類中)
            //2:定義好要用到的參數表達式或常量表達式等
            //3:通過typeof(目標對象所在的類).GetMethod獲得MethodInfo
            //4:利用Expression.Lambda<Action或Func>(MethodCallExpression).compile().Invoke或直接調用compile好的委托,注意:一定要用Action或Func,
            //也就是說不能Expression.Lambda(...),必須要用Expression.Lambda<Action/Func>形式
            Console.WriteLine("a2=" + a2());

到此,關于“MethodCallExpression和Expression.Compile()正確的使用方法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

河曲县| 成安县| 虎林市| 札达县| 永城市| 冀州市| 利川市| 天柱县| 永丰县| 普兰店市| 长垣县| 墨玉县| 且末县| 丹阳市| 鄯善县| 紫金县| 布尔津县| 莱西市| 胶南市| 普兰县| 莲花县| 丹棱县| 金川县| 南涧| 云霄县| 沐川县| 塔城市| 九台市| 读书| 桂阳县| 浦北县| 满洲里市| 土默特左旗| 明水县| 神木县| 黔南| 咸宁市| 苏尼特右旗| 禹州市| 河曲县| 九龙县|