成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺談表達式樹和泛型委托

開發
本文將討論.NET中的表達式樹和泛型委托。表達式樹又稱為表達式目錄樹,以數據形式表示語言級代碼。

什么是表達式樹?

表達式樹又稱為表達式目錄樹,以數據形式表示語言級代碼。所有的數據都存儲在樹結構中,每個結點表示一個表達式(Expression)。要想手動生成表達式樹我們需要引用System.Linq.Expressions 命名空間,最重要的一個類是Expression,它是所有表達式的基類。例如:

1:參數表達式:ParameterExpression,就是一個方法中的參數,例如 search(string key),key可以看成是一個參數表達式。

2:二元表達式:BinaryExpression,例如a+b等。

3:方法調用表達式:MethodCallExpression,例如:自定義LINQ提供程序中實現orderby 的操作:

MethodCallExpressionorderByCallExpression=Expression.Call(
typeof(Queryable),
"OrderBy",
newType[]{queryableData.ElementType,queryableData.ElementType},
whereCallExpression,
Expression.Lambda>(pe,newParameterExpression[]{pe}));

4:常數表達式:ConstantExpression,例如數值5。

5:字段或屬性表達式:MemberExpression,例如str.Length。Expression.Property(pe, typeof(string).GetProperty("Length"));

6:帶有條件運算的表達式:ConditionalExpression。

7:描述lambda表達式:LambdaExpression

8:一元運算符的表達式:UnaryExpression

9:表達式和類型之間的相關操作:TypeBinaryExpression等等,它們都繼承Expression。

泛型委托:

表達式樹經常與泛型委托一起使用,這里簡單介紹下什么是泛型委托。Func<(Of <(T, TResult>)>) 泛型委托:封裝一個具有一個參數并返回 TResult 參數指定的類型值的方法。如果想增加參數可以寫成Func<(Of <(T1,T2, TResult>)>) 等。這種方法比起傳統的顯示聲明委托的方法從代碼結構上要簡化不少,我們不用特意去申請一個delegate,所有的委托都可以用泛型委托來代替。這里簡單來實現一個算術表達式來說明泛型委托的好處。

算術表達:(a+b)^b

1:傳統的顯示申明委托方式。

1):申明一個委托:

///
///(a+b)^b委托
///

///para1
///para2
///
publicdelegatedoublePowerCompute(doublenum_1,doublenum_2);

2):編碼委托對應的方法體

///
///(a+b)^b方法
///

///para1
///para2
///
publicstaticdoubleGetPowerCompute(doublenum_1,doublenum_2)
{
returnMath.Pow((num_1+num_2),num_2);
}
 3):調用:
doubledResult=0;
PowerComputepc=GetPowerCompute;
dResult=pc(2,2);
Console.WriteLine(dResult.ToString());

2:泛型委托實現:

1):編碼委托對應的方法體,方法同上面代碼中第二步。

2):調用

Funcfc=GetPowerCompute;
dResult=fc(2,2);
Console.WriteLine(dResult.ToString());

表達式樹的執行:

表達式樹和泛型委托:這里實現一個簡單的表達式樹,實現(a+b)^b, 過程中需要知道以下三個比較重要的方法。

1:Expression<(Of <(TDelegate>)>) :以表達式目錄樹的形式將強類型 lambda 表達式表示為數據結構。

2: Expression.Lambda方法:創建一個表示 lambda 表達式的表達式目錄樹。

3:Expression<(Of <(TDelegate>)>).Compile :將表達式目錄樹描述的 lambda 表達式編譯為可執行代碼。

下面是(a+b)^b的表達式樹生成可執行代碼并且在客戶端進行調用的代碼:

ParameterExpressionpenum_1=Expression.Parameter(typeof(double),"num_1");
ParameterExpressionpenum_2=Expression.Parameter(typeof(double),"num_2");
BinaryExpression_be=Expression.Add(penum_1,penum_2);
BinaryExpression_be2=Expression.Power(_be,penum_2);
Expression>ef=
Expression.Lambda>(_be2,newParameterExpression[]{

penum_1,penum_2});
Funccf=ef.Compile();
returncf(num_1,num_2);

下面是(a+b)^b的表達式樹的關系圖


表達式樹的修改:

表達式目錄樹是不可變的,這意味著不能直接修改表達式目錄樹。若要更改表達式目錄樹,必須創建現有表達式目錄樹的一個副本,并在創建副本的過程中執行所需更改。您可以使用表達式目錄樹訪問器遍歷現有表達式目錄樹,并復制它訪問的每個節點。我們可以創建自定義類來繼承ExpressionVisitor,在自定義類中重定相應方式來達到修改表達式樹的目的。

【編輯推薦】

  1. 換一個角度看.NET中的理解委托和事件
  2. 跟MVP學C#視頻教程之九 委托與事件
  3. .NET反射、委托技術與設計模式
責任編輯:彭凡 來源: cnblogs
相關推薦

2009-08-27 09:57:50

C# Lambda表達

2010-09-14 14:05:42

C#委托

2009-09-09 13:01:33

LINQ Lambda

2011-05-20 17:50:45

C#

2019-07-17 15:45:47

正則表達式字符串前端

2009-08-10 09:41:07

.NET Lambda

2009-09-17 09:15:49

Linq表達式樹

2025-03-06 08:16:08

lambda表達式變量

2009-04-29 09:05:59

Lambda抽象代表.NET

2018-09-27 15:25:08

正則表達式前端

2009-09-14 14:01:21

LINQ泛型數據集

2014-01-05 17:41:09

PostgreSQL表達式

2009-08-24 15:50:23

C# 泛型C# 泛型委托

2009-02-17 09:10:01

正則表達式Java優化

2009-06-24 10:25:25

C#泛型

2009-08-24 14:43:35

C# 泛型

2009-09-17 09:09:50

Lambda表達式Linq查詢

2010-11-16 14:53:02

Oracle游標表達式

2009-07-21 14:38:08

Scalamatch表達式break和conti

2009-09-16 10:48:31

PHP正則表達式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品成人网 | 日本xx视频免费观看 | 国产日韩欧美二区 | 国产xxxx搡xxxxx搡麻豆 | 久久久久9999亚洲精品 | 国产国拍亚洲精品av | 中文久久 | 一区二区三区在线 | 欧 | 成人国产午夜在线观看 | 国产在线精品一区二区 | 精品国产1区2区3区 在线国产视频 | 少妇特黄a一区二区三区88av | 日韩av成人 | 超碰在线免费公开 | 欧美性tv | 国内精品久久久久久 | av资源在线看 | 久久久99国产精品免费 | 久久国产精品99久久久大便 | 久久精品在线 | 久久久av| 国产网站在线免费观看 | 亚洲欧美中文日韩在线v日本 | 日韩一区二区三区视频在线播放 | 亚洲精品二区 | 毛片国产 | 国产成人精品免费视频大全最热 | 电影91久久久 | 日韩欧美在线一区二区 | 久久久女女女女999久久 | 全部免费毛片在线播放网站 | 久久久精品国产 | 亚洲成人免费视频 | 亚州无限乱码 | 日韩中文字幕一区 | 成人在线视频免费观看 | 中文字幕在线精品 | 日韩高清中文字幕 | 一级片在线播放 | 91国产视频在线 | caoporn免费在线视频 |