動態拼接Lambda表示式-表示式目錄樹動態構建=Expression<Func<MyClass, int>> expressionFunc = x => x.Age + 1
阿新 • • 發佈:2020-12-02
新建測試類
/// <summary> /// 測試類 /// </summary> public class MyClass { //public MyClass() //{ // ClassName = "一般"; //} public int Age { get; set; } public string Name { get; set; } public static string ClassName { get; set; } = "一般"; }
動態拼接Lambda表示式-表示式目錄樹動態構建=Expression<Func<MyClass, int>> expressionFunc = x => x.Age + 1
如下:
public static void TestExpression() { #region Expression simple //Expression<Func<int, int>> expressionFunc = x => x + 1; //var func = expressionFunc.Compile();//var result = func(22); //Console.WriteLine($"Expression<Func<int, int>>執行結果:{result}"); #endregion #region Expression complex //Expression<Func<MyClass, int>> expressionFunc = x => x.Age + 1; //x => x.Age + 1 lambda表示式的具體構造過程,如下,//lambda表示式 等號 左邊的引數parameter ParameterExpression paramLeft = Expression.Parameter(typeof(MyClass)); //lambda表示式 等號 右邊的引數parameter x.Age + 1中的 x.Age MemberExpression memberRight = Expression.PropertyOrField(paramLeft, "Age"); //MyClass的Age屬性,可以再構造lambda表示式的時候傳入,這樣就可以根據需要來構造表示式了 //MemberExpression memberRight2 = Expression.Field(paramLeft, "Age"); //lambda表示式 等號 右邊的引數parameter x.Age + 1中的 1 常量 ConstantExpression constantRight = Expression.Constant(1, typeof(int)); //lambda表示式 等號 右邊的引數parameter x.Age + 1中的 + 加號 BinaryExpression binaryRight = Expression.Add(memberRight, constantRight); //lambda表示式 等號 兩邊的引數parameter x => x.Age + 1;中的 => goto符號 x => x + 1; Expression<Func<MyClass, int>> expressionFunc = Expression.Lambda<Func<MyClass, int>>(binaryRight, paramLeft); //Expression<Func<int, int>> expressionFunc = x => x + 1; var func = expressionFunc.Compile(); MyClass myClass = new() { Age = 11 }; var result = func(myClass); //result = func.Invoke(myClass); Console.WriteLine($"自定義構造lambda表示式樹,產生Expression<Func<MyClass, int>>執行結果:{result}"); #endregion }