表達式目錄樹 1.什麼是表達式目錄樹Expression? 表達式目錄樹是一個數據結構,語法樹。 首先我們去看看 Expressions類 ,定義了一個泛型委托類型 TDelegate: 我們先來一個帶返回值的委托: 其中m、n是兩個Int 類型的參數 通過表達式目錄樹計算 m*n+2: 通過中間語 ...
表達式目錄樹
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 }