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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM