.net 系列:Expression表達式樹

来源:http://www.cnblogs.com/nicholashjh/archive/2017/11/30/7921914.html
-Advertisement-
Play Games

轉至:http://www.cnblogs.com/li-peng/p/3154381.html 整理了一下表達式樹的一些東西,入門足夠了 先從ConstantExpression 開始一步一步的來吧 它表示具有常量值的表達式 我們選建一個控制台應用程式 ConstantExpression _co ...


轉至:http://www.cnblogs.com/li-peng/p/3154381.html

整理了一下表達式樹的一些東西,入門足夠了

先從ConstantExpression 開始一步一步的來吧 它表示具有常量值的表達式

我們選建一個控制台應用程式

ConstantExpression _constExp = Expression.Constant("aaa",typeof(string));//一個常量
//Console.Writeline("aaa");
MethodCallExpression _methodCallexp=Expression.Call(typeof(Console).GetMethod("WriteLine",new Type[]{typeof(string)}),_constExp);
Expression<Action> consoleLambdaExp = Expression.Lambda<Action>(_methodCallexp);
consoleLambdaExp.Compile()();

Console.ReadLine();
下邊的MethodCallExpression你也許不知道是什麼回事,不要急我下邊會詳細講的,這相當於

Console.WriteLine("aaa"); 輸出一個常量,看一下結果

 

如果想自己輸入一個值輸出呢,那就用ParameterExpression 它表示一個參數表達式,我們只要把上邊的代碼做一下小改動就行

ParameterExpression _parameExp = Expression.Parameter(typeof(string), "MyParameter");

MethodCallExpression _methodCallexpP = Expression.Call(typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }), _parameExp);
Expression<Action<string>> _consStringExp = Expression.Lambda<Action<string>>(_methodCallexpP, _parameExp);
_consStringExp.Compile()("Hello!!");
參數parameExp就是一個string類型的變數我們讓它輸出一個Hello!!

 

有點感覺了吧,慢慢來好玩的還在後邊,現在我們就說一下MethodCallExpression它可以調用靜態方法和實例方法,我們上邊的代碼就是調用 的靜態方法

,我先講一下調用靜態方法,再講調用實例方法。

我們建一個返回string的靜態方法,傳入一個object類型的值

public static string ConsStr(object str)
{
string _str = str + "aa";
Console.WriteLine(_str);
return _str;
}
看一下我們是怎麼調用自己的靜態方法的

ParameterExpression _paraObj = Expression.Parameter(typeof(object), "objPara");
MethodCallExpression _MyStateMethod = Expression.Call(typeof(Program).GetMethod("ConsStr", new Type[] { typeof(object) }), _paraObj);
Expression<Func<object, string>> _meyLambdaState = Expression.Lambda<Func<object, string>>(_MyStateMethod, _paraObj);
string s_tr = _meyLambdaState.Compile()("ni Hao");
Console.WriteLine("返回值: " + s_tr);


  new Type[] { typeof(object) } 就是我們的方法里的參數類型,後邊的paraObj是相當於參數值了,如果 是多參數就在 Type[],和後邊再加上相應 的類型和參數就行

靜態方法你有些瞭解了,下麵講一下調用實例方法

我們寫一個非靜態方法

public string ConsStr2(object str)
{
string _str = str + "aa";
Console.WriteLine(_str);
return _str;
}
調用的時候只要把上邊的代碼改動一點就ok Expression.Call為我們提供了我們想要的重載

Program _pg = new Program();
ParameterExpression _paraObj2 = Expression.Parameter(typeof(object), "objPara");
MethodCallExpression _MyStateMethod2 = Expression.Call(Expression.Constant(_pg), typeof(Program).GetMethod("ConsStr2"), _paraObj2);
Expression<Func<object, string>> _meyLambdaState2 = Expression.Lambda<Func<object, string>>(_MyStateMethod2, _paraObj2);
string s_tr2 = _meyLambdaState.Compile()("you shi ni ");
Console.WriteLine("返回值: " + s_tr2);


   簡單吧。

再下來我們講什麼呢,也許你猜到了UnaryExpression一元運算符表達式和 BinaryExpression 二元運算符表達式

我們先看一個這兩個表達式的簡單例子後,我們再做一個複雜的例子

UnaryExpression我們做一個5--的表達式

ConstantExpression _consNum = Expression.Constant(5, typeof(int));
UnaryExpression _unaryPlus = Expression.Decrement(_consNum);
Expression<Func<int>> _unaryLam = Expression.Lambda<Func<int>>(_unaryPlus);
Console.WriteLine(_unaryLam.Compile()());


BinaryExpression 我們做一個a+b的例子 

ParameterExpression _ParaA = Expression.Parameter(typeof(int), "a");
ParameterExpression _ParaB = Expression.Parameter(typeof(int), "b");
BinaryExpression _BinaAdd = Expression.Add(_ParaA, _ParaB);
Expression<Func<int, int, int>> _MyBinaryAddLamb = Expression.Lambda<Func<int, int, int>>(_BinaAdd, new ParameterExpression[] { _ParaA, _ParaB });
Console.WriteLine("表達式: "+ _MyBinaryAddLamb);
Console.WriteLine(_MyBinaryAddLamb.Compile()(3, 6));


  不難吧,

我們做一把兩個表達式放一起做一個例子吧 (a+b)*(--c)

ParameterExpression _ParaA = Expression.Parameter(typeof(int), "a");
ParameterExpression _ParaB = Expression.Parameter(typeof(int), "b");
BinaryExpression _BinaAdd = Expression.Add(_ParaA, _ParaB); //a+b

ParameterExpression _paraC = Expression.Parameter(typeof(int), "c");
UnaryExpression _paraDecr = Expression.Decrement(_paraC); //(a+b)*(--c)
BinaryExpression _binaMultiply = Expression.Multiply(_BinaAdd, _paraDecr);
Expression<Func<int, int, int, int>> _MyBinaryLamb = Expression.Lambda<Func<int, int, int, int>>(_binaMultiply, new ParameterExpression[] { _ParaA, _ParaB, _paraC });
Console.WriteLine("表達式: "+ _MyBinaryLamb);
Console.WriteLine(_MyBinaryLamb.Compile()(3, 6, 5));
  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 直接計算字元串算式方法: ...
  • 射線:從一個點往一個方向,發射一根無限長的射線,這根射線會與場景中帶有 Collider 組件的物體發生碰撞。 射線的使用: 根據上面的代碼: hitInfo.point:表示碰撞點的坐標。 Physics.Raycast():使用這個方法檢測射線時,因為該方法重載很多,一定要弄清楚自己使用的是哪個 ...
  • 實現代碼(C#) 1、發送GET指令 2、接收批量回覆 3、 結果: 代碼重構 1、發送指令 2、接收回覆 3、GET和SET指令 4、重構後的代碼 是不是簡潔很多??? 5、結果 ...
  • 結論: 1、EF 查詢 比ADO慢,甚至直接報告超時錯誤,原因不詳。 2、在原生ADO.Net中 使用 參數化查詢 比 直接使用sql拼接 慢幾十倍!!! ADO.Net代碼測試 EF代碼(已捨棄) 資料庫內部測試 sqlHelper類 博客園非常蛋疼的說:字數少有150字不能發佈的首頁。 答:親, ...
  • using Newtonsoft.Json; using System; using System.Collections.Concurrent; using System.Diagnostics; using System.IO; using System.Threading; using Sys... ...
  • 文檔中包含圖片的話,會使得整個文檔比較大,占用存儲空間且不利於快速、高效的傳輸文件。針對一些包含大量高質圖片的PDF文檔,若是對圖片進行壓縮,可以有效減少文檔的占用空間。並且,在文檔傳輸過程中也可以減少傳送時間,提高效率。本文將介紹2種通過C#來實現PDF圖片文檔壓縮的方法。使用此方法,需要用到最新 ...
  • 相關下載:https://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki 在Visual Studio中要支持訪問SQLite文件數據源,首先需要安裝SQLite .NET的相關組件,安裝完SQLite組件後,就可以在Vi ...
  • 首先定義一個泛型委托類型,如下: 實現泛型委托的主體代碼,並調用: 以上代碼展示了委托類型Function<T>主體定義的四種方式,分別是實名委托、匿名委托、Lambda表達式、expression表達式樹。 從Function<T>委托主體的代碼定義來看是越來越簡單和友好,這些變化很大部分應歸功於 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...