表達式樹練習(xí)實踐:入門基礎(chǔ)

      網(wǎng)友投稿 784 2025-03-31

      目錄


      表達式樹練習(xí)實踐:入門基礎(chǔ)

      lambda 創(chuàng)建表達式樹

      通過 API 創(chuàng)建表達式樹

      什么是表達式樹

      創(chuàng)建表達式樹

      Expression< TDelegate >

      解析/執(zhí)行表達式樹

      表達式樹練習(xí)實踐:入門基礎(chǔ)

      什么是表達式樹

      來自微軟官方文檔的定義:

      表達式樹以樹形數(shù)據(jù)結(jié)構(gòu)表示代碼。

      它能干什么呢?

      你可以對表達式樹中的代碼進行編輯和運算。 這樣能夠動態(tài)修改可執(zhí)行代碼、在不同數(shù)據(jù)庫中執(zhí)行 LINQ 查詢以及創(chuàng)建動態(tài)查詢。

      好不好玩?

      表達式樹還能用于動態(tài)語言運行時 (DLR) 以提供動態(tài)語言和 .NET Framework 之間的互操作性,同時保證編譯器編寫員能夠發(fā)射表達式樹而非 Microsoft 中間語言 (MSIL)。

      哪里有應(yīng)用?

      ORM框架、工作流框架等,使用到 Lambda 的代碼。。。動態(tài)執(zhí)行代碼、動態(tài)組裝代碼等。

      創(chuàng)建表達式樹

      創(chuàng)建表達式樹有兩種方式:通過 lambda 表達式、通過 API。

      創(chuàng)建表達式樹的意思是,在此之前已經(jīng)編寫好每個結(jié)點,最后使用代碼將所有結(jié)點組合起來,生成表達式樹。

      示例(通過API創(chuàng)建表達式樹)

      ``` ????????????ParameterExpression?a?=?Expression.Parameter(typeof(int),?"i"); ????????????ParameterExpression?b?=?Expression.Parameter(typeof(int),?"j"); ????????????Expression?r1?=?Expression.Multiply(a,?b);??????//乘法運行 ????????????ParameterExpression?c?=?Expression.Parameter(typeof(int),?"x"); ????????????ParameterExpression?d?=?Expression.Parameter(typeof(int),?"y"); ????????????Expression?r2?=?Expression.Multiply(c,?d);??????//乘法運行 ????????????Expression?result?=?Expression.Add(r1,?r2);?????//相加 ????????????//以上代碼產(chǎn)生結(jié)點 ????????????//生成表達式 ????????????Expression>?func?=?Expression.Lambda>(result,?a,?b,?c,?d);????????????var?com?=?func.Compile(); ????????????Console.WriteLine("表達式"?+?func); ????????????Console.WriteLine(com(12,?12,?13,?13)); ????????????Console.ReadKey();

      上面關(guān)于表達式樹的代碼很多,以下這一步叫生成/創(chuàng)建表達式樹。

      Expression>?func?=?Expression.Lambda>(result,?a,?b,?c,?d);

      以下這句叫執(zhí)行表達式樹

      var?com?=?func.Compile();

      其它代碼是用于生成表達式樹結(jié)點/邏輯。

      回歸正題,創(chuàng)建表達式樹的兩種方法。

      lambda 創(chuàng)建表達式樹

      上面的表達式樹示例,是用于生成

      (?i?*?j?)?+?(?x?*?y?)

      但是就這么簡單的操作,要寫這么長,實在不合理。

      而通過 lambda ,可以這樣寫

      Expression>?func?=?(i,?j,?x,?y)?=>?(i?*?j)?+?(x?*?y);

      如果使用 lambda 生成表達式樹, lambda 只能使用單行語句,不能使用 if、for等語句。

      具體關(guān)于 Lambda 的表達式樹,后面其它文章有說明。

      通過 API 創(chuàng)建表達式樹

      就是這樣

      Expression>?func?=?Expression.Lambda>(result,?a,?b,?c,?d);

      兩種方式左邊的都是一樣的,區(qū)別在于等號右邊。

      Expression< TDelegate >

      上面示例的最終結(jié)果都是生成

      Expression>?func

      func 是表達式樹變量。

      我們可以了解以下表達式樹具有的方法和屬性。

      用于生成表達式樹結(jié)點的,是 Expression 類型。

      那么,創(chuàng)建的表達式樹 func ,是?Expression類型。

      表達式樹練習(xí)實踐:入門基礎(chǔ)

      定義如下

      public?sealed?class?Expression?:?LambdaExpression

      具有方法如下

      由于?Expression?繼承了?LambdaExpression,所以有很多屬性方法也可以用。

      好了,以上權(quán)當(dāng)小筆記,備忘,目前先用不上,后面慢慢來使用。

      解析/執(zhí)行表達式樹

      創(chuàng)建表達式樹后,就要執(zhí)行表達式樹。

      在此之前,你需要了解 委托 Delegate,F(xiàn)unc,Action,以及他們中間的關(guān)系。

      執(zhí)行表達式樹是這樣子的

      Expression>?func?=?Expression.Lambda>(result,?a,?b,?c,?d);????????????var?com?=?func.Compile();????????????var?runRasult?=?com(12,?12,?13,?13);

      func 只是一個表達式樹,我們把表達式樹構(gòu)建好后,“要將表達式樹轉(zhuǎn)為代碼”,使用

      .Compile()?方法,可以將表達式樹生成一個 委托(例如上面的 com)。

      為了簡潔上面使用了 var,實際上是這樣的

      Func?com?=?func.Compile();

      四個參數(shù),一個返回值。

      var?runRasult?=?com(12,?12,?13,?13);

      C#里有語法糖,對委托可以這樣寫

      Expression>?func?=?Expression.Lambda>(result,?a,?b,?c,?d);????????int?runRasult?=?func.Compile()(12,?12,?13,?13);

      以后后面都是這樣寫了,能夠縮成一行的代碼,就沒必要寫出兩行。

      在 Vs 里面調(diào)試和查看表達式樹,可以看這里

      https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/expression-trees/debugging-expression-trees-in-visual-studio

      初學(xué)者不必糾結(jié)于這些,了解一下本文內(nèi)容,記一下概要信息即可。

      一個逗逗的大學(xué)生

      軟件開發(fā)

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:如何在excel批量加-
      下一篇:Excel單元格左上方的綠色小三角有什么用如何將其取消掉(excel表格右上角綠色三角怎么去掉)
      相關(guān)文章
      中文字幕亚洲综合小综合在线 | 亚洲国语精品自产拍在线观看| 国产成人精品日本亚洲语音| 亚洲日韩国产二区无码| 国产成人精品日本亚洲专| 亚洲午夜一区二区电影院| 亚洲日韩在线视频| 亚洲日韩在线视频| 亚洲一级毛片免观看| 亚洲AV成人无码天堂| 亚洲jizzjizz在线播放久| 亚洲首页国产精品丝袜| 国产亚洲中文日本不卡二区| 日韩亚洲国产综合高清| 亚洲综合激情五月色一区| 亚洲日韩精品无码专区| 亚洲精品无码mⅴ在线观看| 国产精品亚洲精品日韩电影| 国产精品亚洲专区无码不卡| 亚洲AV日韩精品一区二区三区| 亚洲AV无码一区二区三区国产| 亚洲综合亚洲综合网成人| 激情97综合亚洲色婷婷五| 亚洲精品无码Av人在线观看国产| 亚洲成av人在线视| 亚洲AV乱码久久精品蜜桃 | 亚洲AV无码一区二区三区网址| 国产精品亚洲lv粉色| 亚洲国产一区明星换脸| 久久精品国产精品亚洲人人| 亚洲最大激情中文字幕| 亚洲bt加勒比一区二区| 亚洲视频国产精品| xxx毛茸茸的亚洲| 亚洲av无码av在线播放| 亚洲精品成人区在线观看| 亚洲精品字幕在线观看| 91天堂素人精品系列全集亚洲| 亚洲av永久无码精品天堂久久| 亚洲免费网站观看视频| 亚洲国产精品一区二区第一页免|