zoukankan      html  css  js  c++  java
  • 表达式树使用(三)

    你应该随遇而安,尽可能地享受生活。

    Program.cs代码:

    internal class Program
        {
            private static void Main(string[] args)
            {
                MethodOne();
                MethodTwo();
                MethodThree();
                MethodFour();
                Console.WriteLine();
    
            }
    
            private static void MethodOne()
            {
                //快速创建表达式树
                Expression<Func<int, bool>> lambda = num => num < 5;
                Console.WriteLine(lambda.Compile()(5));
                Console.ReadLine();
            }
    
            private static void MethodTwo()
            {
                //手动创建表达式树
                ParameterExpression numParam = Expression.Parameter(typeof(int), "num");
                ConstantExpression five = Expression.Constant(5, typeof(int));
                BinaryExpression numLessThanFive = Expression.LessThan(numParam, five);
    
                var exp = Expression.Lambda<Func<int, bool>>(numLessThanFive, new ParameterExpression[] { numParam });
    
                Console.WriteLine(exp.Compile()(10));
                Console.ReadLine();
            }
    
    
            //要使用API创建表达式树,需要使用Expression类。该类提供创建特定类型的表达式树节点的静态方法,
            //例如:ParameterExpression(表示一个变量或参数)或MethodCallExpression(表示一个方法调用)。
            //下面演示使用API创建一个表达式树:
            private static void MethodThree()
            {
                ParameterExpression value = Expression.Parameter(typeof(int), "value");
                ParameterExpression result = Expression.Parameter(typeof(int), "result");
    
                //创建要从循环跳出的标签。
                LabelTarget label = Expression.Label(typeof(int));
    
    
                //创建一个 System.Linq.Expressions.BlockExpression,其中包含给定的变量和表达式。
                // 表示一个包含可在其中定义变量的表达式序列的块。
                BlockExpression block = Expression.Block(new[] { result },  //声明 result 范围变量
                    //创建一个表示赋值运算的 System.Linq.Expressions.BinaryExpression。
                    Expression.Assign(result, Expression.Constant(1)),
                    //创建具有给定主体和中断目标的 System.Linq.Expressions.LoopExpression。
                    Expression.Loop(
    
                       //判断分支if(){}else{}
                        Expression.IfThenElse(
                            Expression.GreaterThan(value, Expression.Constant(1)),
                            Expression.MultiplyAssign(result, Expression.PostDecrementAssign(value)),
                            Expression.Break(label, result)
                            ),
                        label
                        )
                    );
    
                //将表达式树描述的lambda表达式编译为可执行代码,并生成表示该lambda表达式的委托
                //Func<int, int> haha = Expression.Lambda<Func<int, int>>(block, value).Compile();
    
    
                int factorial = Expression.Lambda<Func<int, int>>(block, value).Compile()(5);
    
    
                Console.WriteLine("阶乘的结果:" + factorial);
                Console.ReadLine();
            }
    
            private static void MethodFour()
            {
                //可以看到表达式树主要由下面四部分组成:
                //1、Body 主体部分
                //2、Parameters 参数部分
                //3、NodeType 节点类型
                //4、Lambda表达式类型
    
                //将Lambda表达式转换为类型Expression<T>的表达式树
                //exprTree不是可执行代码
                Expression<Func<int, bool>> exprTree = num => num < 5;
    
    
    
                //参数表达式
                var param = exprTree.Parameters[0];
    
                //操作符
                var operation = (BinaryExpression)exprTree.Body;
    
                //左子树
                var left = (ParameterExpression)operation.Left;
    
                //右子树
                var right = (ConstantExpression)operation.Right;
    
                Console.WriteLine("分解表达式: {0} => {1} {2} {3}", param.Name, left.Name, operation.NodeType, right.Value);
                Console.ReadLine();
            }
        }
    

    运行结果如图:

    这里写图片描述

  • 相关阅读:
    Javascript 获得数组中相同或不同的数组元素
    JS 获取(期号、当前日期、本周第一天、最后一天及当前月第一、最后天函数)
    Intellij IDEA2020.2.3最新激活码激活破解方法(2020.11.26)
    【jQuery 区别】.click()和$(document).on("click","指定的元素",function(){});的区别
    pytorch repeat 和 expand 函数的使用场景,区别
    python小技巧
    提高GPU利用率
    pyinstaller 打包文件(包括使用管理员模式)
    frp 开机自启动
    AUC指标深度理解
  • 原文地址:https://www.cnblogs.com/Wulex/p/6962311.html
Copyright © 2011-2022 走看看