1. 程式人生 > >Expression

Expression

表示式目錄樹

1.什麼是表示式目錄樹Expression?

表示式目錄樹是一個數據結構,語法樹。

首先我們去看看 Expressions類 ,定義了一個泛型委託型別 TDelegate:

1     // 摘要:
2     //     將強型別化的 Lambda 表示式表示為表示式樹形式的資料結構。 此類不能被繼承。
3     //
4     // 型別引數:
5     //   TDelegate:
6     //     該委託的型別, System.Linq.Expressions.Expression`1 表示。
7     public sealed class
Expression<TDelegate> : LambdaExpression

我們先來一個帶返回值的委託: 其中m、n是兩個Int 型別的引數

1 Func<int, int, int> func = (m, n) => m * n + 2;
//lambda例項化委託  是個方法 是例項化委託的引數
int iResult1 =func.Invoke(1,3); //呼叫執行

通過表示式目錄樹計算  m*n+2:

1  Expression<Func<int, int, int>> exp = (m, n) => m * n + 2
; 2 int iResult2 = exp.Compile().Invoke(1, 2);
//Complie()方法將編譯表示式樹由描述為可執行程式碼的 lambda 表示式,並生成一個委託,表示 lambda 表示式。所以可以呼叫Invoke方法。

通過中間語言IL反編譯檢視原始碼 Expression<Func<int, int, int>> exp = (m, n) => m * n + 2 

 

表示式目錄樹結構拆分步驟:

手動拼裝表示式目錄樹  m * n + m + n + 2;

 1
{ 2 //Expression<Func<int, int, int>> expression = (m, n) => m * n + m + n + 2; 3 //int iResult = expression.Compile().Invoke(1, 2); 4 5 ParameterExpression m = Expression.Parameter(typeof(int), "m"); //第一個引數 M 6 ParameterExpression n = Expression.Parameter(typeof(int), "n"); //第二個引數 n 7 var constant = Expression.Constant(2); //常量 2 8 9 var mutiply = Expression.Multiply(m, n); // m*n 10 var plus1 = Expression.Add(mutiply, m); // m*n+m 11 var plus2 = Expression.Add(plus1, n); //m*n+m+n 12 var plus3 = Expression.Add(plus2, constant); //m*n+m+n+2 13 Expression<Func<int, int, int>> expression = Expression.Lambda<Func<int, int, int>>(plus3, new ParameterExpression[] { m, n });
//組裝表示式目錄樹
14 int iResult = expression.Compile().Invoke(1, 2);//呼叫 15 }