真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

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

創(chuàng)新互聯(lián)是一家專業(yè)提供眉山企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站制作、網(wǎng)站建設(shè)、H5場景定制、小程序制作等業(yè)務(wù)。10年已為眉山眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計公司優(yōu)惠進行中。

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

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

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

class ClassMethodCallExpression:IMethodCallExpression
    {

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

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

            MethodInfo mi2 = typeof(ClassMethodCallExpression).GetMethod("methodfun",new Type[]{typeof(int)});
            ConstantExpression ce2 = Expression.Constant(5);
            MethodCallExpression mce2 = Expression.Call(Expression.Constant(imce),mi2, ce2);//針對非靜態(tài)方法
            //Expression.Call方法中,無Expression instance則表示將調(diào)用的是靜態(tài)方法
            //當(dāng)MehtodCallExpression準(zhǔn)備調(diào)用實例方法時,可以通過Expression.Constant(實例對象變量)創(chuàng)建ConstantExpression,然后將這個ConstantExpression當(dāng)作instance傳參
            //具體以及更復(fù)雜的例子參考 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>(mce2).Compile();
            //MethodCallExpression使用步驟(如果是靜態(tài)方法當(dāng)然不需要目標(biāo)對象變量)
            //1:定義好要用到的目標(biāo)對象變量(因為最終要執(zhí)行的方法在它所屬的類中)
            //2:定義好要用到的參數(shù)表達(dá)式或常量表達(dá)式等
            //3:通過typeof(目標(biāo)對象所在的類).GetMethod獲得MethodInfo
            //4:利用Expression.Lambda(MethodCallExpression).compile().Invoke或直接調(diào)用compile好的委托,注意:一定要用Action或Func,
            //也就是說不能Expression.Lambda(...),必須要用Expression.Lambda形式
            Console.WriteLine("a2=" + a2());

到此,關(guān)于“MethodCallExpression和Expression.Compile()正確的使用方法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
網(wǎng)站題目:MethodCallExpression和Expression.Compile()正確的使用方法
網(wǎng)站路徑:http://weahome.cn/article/jpegcp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部