zoukankan      html  css  js  c++  java
  • 动态拼接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}");
            }
  • 相关阅读:
    Mithril – 构建杰出 Web 应用的 JS MVC 框架
    构建 iOS 风格移动 Web 应用程序的8款开发框架
    优秀设计:纹理在网页设计中的20个应用示例
    HTML5 Dashboard – 那些让你激动的 Web 技术
    免费下载!10套流行的扁平化界面设计素材
    另类网页设计:30个复古怀旧风格的网站作品
    2014年3月新鲜出炉的最佳 JavaScript 工具库
    25个最佳的 WordPress Gallery 画廊插件
    Gremlins.js – 模拟用户随机操作的 JS 测试库
    15款提高工作效率的 Web 项目管理工具
  • 原文地址:https://www.cnblogs.com/1175429393wljblog/p/14074107.html
Copyright © 2011-2022 走看看