动态拼接Lambda表达式-表达式目录树动态构建及修改
修改 构建 动态 目录 表达式 lambda 拼接
2023-09-14 08:57:06 时间
动态拼接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}"); }
相关文章
- [原创]琢磨一种察看/修改C#堆中东西的方法(随笔)
- CFileDialog对话框中,如何修改对话框标题
- 【LINUX 学习】指定与修改挂载参数
- windows server2008 R2下mysql 5.7版本中修改编码为utf-8的方法步骤
- SQL Server修改数据库对象所有者(Owner)浅析
- Java实现 LeetCode 307 区域和检索 - 数组可修改
- 简单解决Ubuntu修改locale的问题
- 修改mongodb3.0副本集用户密码遇到的坑
- 如何查询 ABAP 传输请求(Transport Request)和使用该请求修改了的程序的信息?
- 判断ABAP software component是否可修改及可extend的API
- Atitit 提升扩展性指标与方法总结 目录 1. 扩展性常见指标1 1.1. 代码简洁,应业务变动调整修改少1 1.2. 免编译1 1.3. 是否支持热部署2 2. 常见的方法策略2
- ECharts配置title(标题)字体颜色样式属性修改
- 修改avue样式
- android-framework 系统修改记录
- ubuntu修改ssh服务的端口号
- php配置修改后,平滑启动php-fpm
- linux查看和修改PATH环境变量的方法