天天看點

表達式目錄樹(一)

(一)Lambda建立表達式目錄樹

Expression<Func<int, int, int>> exp1 = (a, b) => a * b+2;

說明一下:Func

Func<(Of <(T1, T2, TResult>)>)

泛型委托:封裝一個具有兩個參數并傳回 TResult 參數指定的類型值的方法。

T1:此委托封裝的方法的第一個參數類型。

T2:此委托封裝的方法的第二個參數類型。

Tresult:此委托封裝的方法的傳回值類型。

例如:現在求2個int類型的和

(1) 原始的方法

public int Add(int a, int b)

{

    return a + b;

}

(2)通過委托來實作

delegate int deleAdd(int a, int b);

public void DeleConcrete()

    deleAdd deleadd= Add;

    deleadd(1, 2);

(3)直接通過泛型委托Func來實作

public int GetFunc(int a,int b)

    Func<int, int, int> add = Add;

    return add(a, b);

(二)分解表達式目錄樹

這點可能想到國小數學中的四則運算。對于a*b+2來說,先算乘,再算加

    用圖表示為:

表達式目錄樹(一)

每個矩形框為一個節點(表達式類型),節點有多種類型。

附表表達式類型:

說明

BinaryExpression

表示包含二進制運算符的表達式。

ConditionalExpression

表示包含條件運算符的表達式。

ConstantExpression

表示具有常量值的表達式。

ElementInit

表示 IEnumerable 集合的單個元素的初始值設定項。

Expression

提供一種基類,表示表達式目錄樹節點的類派生自該基類。它還包含用來建立各種節點類型的 static(在 Visual Basic 中為 Shared)工廠方法。這是一個 abstract 類。

Expression<(Of <(TDelegate>)>)

以表達式目錄樹的形式将強類型 lambda 表達式表示為資料結構。無法繼承此類。

InvocationExpression

表示将委托或 lambda 表達式應用于參數表達式清單的表達式。

LambdaExpression

描述一個 lambda 表達式。

ListInitExpression

表示包含集合初始值設定項的構造函數調用。

MemberAssignment

表示初始化新建立對象的字段或屬性。

MemberBinding

提供一種基類,該基類派生表示綁定的類,這些綁定用于初始化新建立對象的成員。

MemberExpression

表示通路字段或屬性。

MemberInitExpression

表示調用構造函數并初始化新對象的一個或多個成員。

MemberListBinding

表示初始化新建立對象的集合成員的元素。

MemberMemberBinding

表示初始化新建立對象的成員的成員。

MethodCallExpression

表示調用一種方法。

NewArrayExpression

表示建立新數組并可能初始化該新數組的元素。

NewExpression

表示構造函數調用。

ParameterExpression

表示命名的參數表達式。

TypeBinaryExpression

表示表達式和類型之間的操作。

UnaryExpression

表示包含一進制運算符的表達式。

而這個(a+b)*2的幾個節點:

·a,b是參數,類型為ParameterExpression

·+,*,為二進制運符,類型為BinaryExpression

·2為常量,類型為ConstantExpression

(三)通過表達式類型來建立目錄樹

   a*b+2

節點有4個,2個參數,2個運算符,1個常量

·兩個參數

//兩個參數

ParameterExpression a = Expression.Parameter(typeof(int), "a");

ParameterExpression b = Expression.Parameter(typeof(int), "b"); 

//求積

BinaryExpression Multi=Expression.Multiply(a,b); 

//常量

ConstantExpression x2 = Expression.Constant(2); 

//求和

BinaryExpression Add = Expression.Add(Multi, x2); 

//建立一個表示lambda表達式的對象

LambdaExpression lexp = Expression.Lambda<Func<int, int, int>>(Add, a, b); 

//檢視表達式

Console.WriteLine(lexp.ToString());

建立方法是通過Expression的工廠方法來建立。

(四)使用

Expression<Func<int, int, int>> lexp = Expression.Lambda<Func<int, int, int>>(Add, a, b);

Func<int, int, int> fun = lexp.Compile();

Console.WriteLine(fun(3,5));

更多内容請參見:

ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/dv_fxadvance/html/fb1d3ed8-d5b0-4211-a71f-dd271529294b.htm

http://kb.cnblogs.com/page/42509/?page=1

部落格園大道至簡

<a href="http://www.cnblogs.com/jams742003/" target="_blank">http://www.cnblogs.com/jams742003/</a>

轉載請注明:部落格園

繼續閱讀