• 动态拼接Lambda表达式-表达式目录树动态构建及修改


    动态拼接Lambda表达式-表达式目录树动态构建及修改

    访问 :表达式树 Expression<Func<int, int, int>> predicate1 = (m, n) => m * n + 2;
    修改:  (m, n) => m * n + 2;改成(m, n) => m * n - 2;

     /// <summary>
            /// 访问 表达式树 Expression<Func<int, int, int>> predicate1 = (m, n) => m * n + 2;
            /// (m, n) => m * n + 2;改成(m, n) => m * n - 2;
            /// </summary>
            public class OperatorExpressionVisitor : ExpressionVisitor
            {
                /// <summary>
                /// 修改表达式树的形式
                /// </summary>
                /// <param name="expression"></param>
                /// <returns></returns>
                public Expression Modify(Expression expression)
                {
                    //base.Visit(expression);
                    if (expression is BinaryExpression binary)
                    {
                        if (binary.NodeType == ExpressionType.Add)
                        {
                            var left = base.Visit(binary.Left); ;
                            var right = base.Visit( binary.Right);
                            var result = Expression.Subtract(left, right);
                            return result;
                        }
                    }
                    return expression;
                }
    
                /// <summary>
                /// 表达式树的二元操作
                /// </summary>
                /// <param name="node"></param>
                /// <returns></returns>
                protected override Expression VisitBinary(BinaryExpression node)
                {
                    return base.VisitBinary(node);
                }
    
                /// <summary>
                /// 表达式树的常量操作
                /// </summary>
                /// <param name="node"></param>
                /// <returns></returns>
                protected override Expression VisitConstant(ConstantExpression node)
                {
                    return base.VisitConstant(node);
                }
            }
    
            /// <summary>
            /// 测试表达式树的访问过程
            /// </summary>
            public static void TestDynamicExpressionVisitor()
            {
                Expression<Func<int, int, int>> predicate = (m, n) => m * n + 2;
                //修改之前
                var func1 = predicate.Compile();
                var result1 = func1.Invoke(2, 3);
                Console.WriteLine($"参数2,3");
                Console.WriteLine($"修改---前");
                Console.WriteLine($"body:{predicate.Body}");
                Console.WriteLine($"结果:{result1}");
                OperatorExpressionVisitor visitor = new OperatorExpressionVisitor();
                var expression = visitor.Modify(predicate.Body);
                Expression<Func<int, int, int>> lam = Expression.Lambda<Func<int, int, int>>(expression, predicate.Parameters); 
                var func = lam.Compile();
                var result = func.Invoke(2, 3);
                Console.WriteLine($"修改---后");
                Console.WriteLine($"body:{lam.Body}");
                Console.WriteLine($"结果:{result}");
            }
  • 相关阅读:
    jtopo
    转载model2
    转载model
    Vue -- 后台系统布局导航栏
    Vue -- iview表格 axiso调用接口数据
    Vue -- 视频&&下载 组件
    Vue -- echarts 折线图demo
    Vue -- axios封装
    Vue -- 验证码
    01 & 02 & 03笔记
  • 原文地址:https://www.cnblogs.com/1175429393wljblog/p/14074107.html
Copyright © 2020-2023  润新知