表达式树使用(三)

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


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();
        }
    }

运行结果如图:

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值