日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
詳解C#Lambda表達(dá)式的動(dòng)態(tài)生成

對(duì)于C# Lambda的理解我們?cè)谥暗奈恼轮幸呀?jīng)講述過(guò)了,那么作為Delegate的進(jìn)化使用,為了讓代碼簡(jiǎn)潔和優(yōu)雅的呈現(xiàn),C# Lambda表達(dá)式的使用功不可滅,那么依托外部條件如何動(dòng)態(tài)構(gòu)建C# Lambda表達(dá)式呢。下面讓我們來(lái)具體的看看實(shí)施。

我們提供的服務(wù)有:成都做網(wǎng)站、網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、趙縣ssl等。為上1000+企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的趙縣網(wǎng)站制作公司

或許你會(huì)奇怪這個(gè)需求是如何產(chǎn)生的…… 首先,Lambda 在 DLinq 中承擔(dān)了以往 T-SQL 的部分角色;其次,在數(shù)據(jù)庫(kù)設(shè)計(jì)中,我們往往需要依據(jù)外部未知的動(dòng)態(tài)條件組合來(lái)查詢數(shù)據(jù)。而問(wèn)題在于作為一種靜態(tài)語(yǔ)言,我們顯然無(wú)法用動(dòng)態(tài)語(yǔ)法或者拼接字符串的方法來(lái)創(chuàng)建一個(gè)Delegate/Lambda,那么如何達(dá)到類(lèi)似的目的呢?CodeDom?Emit?或許最佳的選擇是 System.Linq.Expressions.Expression。

1、首先我們了解一個(gè)簡(jiǎn)單C# Lambda表達(dá)式的構(gòu)成。

 
 
 
  1. i => i > 5 

在這個(gè)表達(dá)式中,"i" 被稱為 Parameter,"i > 5" 是 Body。我們可以對(duì) Body 進(jìn)行更進(jìn)一步的分解,那么 "i > 5" 分別包含參數(shù)(i)、操作符(>)以及一個(gè)常數(shù)(5)。所有這些通過(guò)特定順序的組合,從而構(gòu)建一個(gè)完整的 Lambda 表達(dá)式。

2、我們通過(guò)一些例子,來(lái)學(xué)習(xí)如何動(dòng)態(tài)構(gòu)建C# Lambda表達(dá)式。

動(dòng)態(tài)構(gòu)建C# Lambda表達(dá)式例子1

 
 
 
  1. var ints =   
  2. new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };  
  3. //var r = ints.Where(i => i > 5);   
  4. // 要實(shí)現(xiàn)的表達(dá)式  
  5.  
  6. // 創(chuàng)建參數(shù) i  
  7. var parameter =   
  8. Expression.Parameter(typeof(int), "i");  
  9.  
  10. // 創(chuàng)建常量5  
  11. var constant =   
  12. Expression.Constant(5);  
  13.  
  14. // 創(chuàng)建比較表達(dá)式 i > 5  
  15. var bin =   
  16. Expression.GreaterThan(parameter, constant);  
  17.  
  18. // 獲取Lambda表達(dá)式  
  19. var lambda =   
  20. Expression.Lambda>(bin, parameter);  
  21.  
  22. // 通過(guò) Compile 方法獲取 Delegate  
  23. var _r = ints.Where(lambda.Compile());  

在代碼中設(shè)置斷點(diǎn),我們可以看到調(diào)試器中顯示的表達(dá)式信息。

圖1

.NET FX 3.5 中為 Lambda 新增了一些委托類(lèi)型。

(1) 用于處理無(wú)返回?cái)?shù)據(jù)的 Action。

 
 
 
  1. public delegate void   
  2. Action()  
  3. public delegate void   
  4. Action (T arg)  
  5. public delegate void   
  6. Action (T1 arg1, T2 arg2)  
  7. public delegate void   
  8. Action   
  9. (T1 arg1, T2 arg2, T3 arg3)  
  10. public delegate void   
  11. Action   
  12. (T1 arg1, T2 arg2, T3 arg3, T4 arg4) 

(2) 用于處理帶返回?cái)?shù)據(jù)的 Func。

 
 
 
  1. public delegate TResult   
  2. Func ()  
  3. public delegate TResult  
  4. Func (T arg)  
  5. public delegate TResult   
  6. Func   
  7. (T1 arg1, T2 arg2)  
  8. public delegate TResult   
  9. Func   
  10. (T1 arg1, T2 arg2, T3 arg3)  
  11. public delegate TResult   
  12. Func   
  13. (T1 arg1, T2 arg2, T3 arg3, T4 arg4) 

我們還可以進(jìn)行更復(fù)雜的組合。

動(dòng)態(tài)構(gòu)建C# Lambda表達(dá)式例子2

 
 
 
  1. var ints =   
  2. new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };  
  3. // var r =   
  4. ints.Where(i => i > 5 && i <= 7);  
  5.  // 要實(shí)現(xiàn)的表達(dá)式  
  6.  
  7. // 創(chuàng)建參數(shù) i  
  8. var parameter =   
  9. Expression.Parameter(typeof(int), "i");  
  10.  
  11. // 創(chuàng)建表達(dá)式 i > 5   
  12. var con1 =   
  13. Expression.Constant(5);  
  14. var bin1 =   
  15. Expression.GreaterThan(parameter, con1);  
  16.  
  17. // 創(chuàng)建表達(dá)式 i <= 7  
  18. var con2 =   
  19. Expression.Constant(7);  
  20. var bin2 =   
  21. Expression.LessThanOrEqual(parameter, con2);  
  22.  
  23. // 組合兩個(gè)表達(dá)式  
  24. var body =   
  25. Expression.And(bin1, bin2);  
  26.  
  27. // 獲取 Lambda 表達(dá)式  
  28. var lambda =   
  29. Expression.Lambda>(body, parameter);  
  30.  
  31. var _r = ints.Where(lambda.Compile());  

在例子2中,我們對(duì)復(fù)雜的表達(dá)式進(jìn)行了分解,并使用 And 完成多個(gè)表達(dá)式的組裝,由此我們可以創(chuàng)建更加復(fù)雜的邏輯組合,比如例子3。#p#

動(dòng)態(tài)構(gòu)建C# Lambda表達(dá)式例子3

 
 
 
  1. var ints =   
  2. new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };  
  3. // var r =   
  4. ints.Where(i => (i > 5 && i <= 7) || (i == 3));   
  5. // 要實(shí)現(xiàn)的表達(dá)式  
  6.  
  7. // 創(chuàng)建參數(shù) i  
  8. var parameter =   
  9. Expression.Parameter(typeof(int), "i");  
  10.  
  11. // 創(chuàng)建表達(dá)式 i > 5  
  12. var con1 =   
  13. Expression.Constant(5);  
  14. var bin1 =   
  15. Expression.GreaterThan(parameter, con1);  
  16.  
  17. // 創(chuàng)建表達(dá)式 i < 7  
  18. var con2 =   
  19. Expression.Constant(7);  
  20. var bin2 =   
  21. Expression.LessThanOrEqual(parameter, con2);  
  22.  
  23. // 創(chuàng)建表達(dá)式 i == 3  
  24. var con3 =   
  25. Expression.Constant(3);  
  26. var bin3 =   
  27. Expression.Equal(parameter, con3);  
  28.  
  29. // 組合 i > 5 && i <= 7  
  30. var body =   
  31. Expression.And(bin1, bin2);  
  32.  
  33. // 組合 ( i > 5 && i <= 7) OR (i == 3)  
  34. body = Expression.Or(body, bin3);  
  35.  
  36. var lambda =   
  37. Expression.Lambda>  
  38. (body, parameter);  
  39. var _r = ints.Where(lambda.Compile());  

我們繼續(xù)看幾個(gè)常見(jiàn)的例子。

動(dòng)態(tài)構(gòu)建C# Lambda表達(dá)式例子4

 
 
 
  1. var ints =   
  2. new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };  
  3. //var r = ints.Select(i => i % 2 == 0 ? i : 0);   
  4. // 要實(shí)現(xiàn)的表達(dá)式  
  5.  
  6. // 創(chuàng)建參數(shù) i  
  7. var parameter =   
  8. Expression.Parameter(typeof(int), "i");  
  9.  
  10. // 創(chuàng)建表達(dá)式 i % 2  
  11. var con1 =   
  12. Expression.Constant(2);  
  13. var bin1 =   
  14. Expression.Modulo(parameter, con1);  
  15.  
  16. // 創(chuàng)建表達(dá)式 (i % 2) == 0  
  17. var con2 =   
  18. Expression.Constant(0);  
  19. var bin2 =   
  20. Expression.Equal(bin1, con2);  
  21.  
  22. // 創(chuàng)建表達(dá)式 IIF(((i % 2) = 0), i, 0)  
  23. var bin3 =   
  24. Expression.Condition  
  25. (bin2, parameter, Expression.Constant(0));  
  26.  
  27. var lambda =   
  28. Expression.Lambda>(bin3, parameter);  
  29. var _r = ints.Select(lambda.Compile());  

動(dòng)態(tài)構(gòu)建C# Lambda表達(dá)式例子5

 
 
 
  1. var ints =   
  2. new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };  
  3. // Array.ForEach(ints, i => Console.WriteLine(i));  
  4.  // 要實(shí)現(xiàn)的表達(dá)式  
  5.  
  6. // 創(chuàng)建參數(shù)i  
  7. var parameter =   
  8. Expression.Parameter(typeof(int), "i");  
  9.  
  10. // 獲取 Console.WriteLine MethodInfo  
  11. MethodInfo method =   
  12. typeof(Console).GetMethod(  
  13. "WriteLine", new Type[] { typeof(int) });  
  14.  
  15. // 創(chuàng)建表達(dá)式   
  16. var call = Expression.Call(method, parameter);  
  17.  
  18. var lambda =   
  19. Expression.Lambda>(call, parameter);  
  20. Array.ForEach(  
  21. ints, lambda.Compile());  

是該花點(diǎn)時(shí)間去好好研究一下 System.Linq.Expressions Namespace 了……

動(dòng)態(tài)構(gòu)建C# Lambda表達(dá)式的基本內(nèi)容就向你介紹到這里,希望那個(gè)對(duì)你了解和掌握使用動(dòng)態(tài)構(gòu)建C# Lambda表達(dá)式有所幫助。

【編輯推薦】

  1. LINQ to SQL刪除實(shí)現(xiàn)體會(huì)小結(jié)
  2. LINQ刪除記錄的操作實(shí)現(xiàn)
  3. 實(shí)現(xiàn)LINQ刪除數(shù)據(jù)的巧妙方法
  4. 詳解實(shí)現(xiàn)LINQ to SQL刪除行
  5. C# Lambda Expression概念淺析

當(dāng)前文章:詳解C#Lambda表達(dá)式的動(dòng)態(tài)生成
本文鏈接:http://www.5511xx.com/article/dhoieoo.html