1. 程式人生 > 實用技巧 >動態拼接Lambda表示式-表示式目錄樹動態構建=Expression<Func<MyClass, int>> expressionFunc = x => x.Age + 1

動態拼接Lambda表示式-表示式目錄樹動態構建=Expression<Func<MyClass, int>> expressionFunc = x => x.Age + 1

新建測試類

/// <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 }