表达式树使用(三)

Program.cs代码:

internal class Program
    {
        private static void Main(string[] args)
        {
            MethodOne();
            MethodTwo();
            MethodThree();
            MethodFour();
            Console.WriteLine();

        }

        private static void MethodOne()
        {
            //快速创建表达式树
            Expression> 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>(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 haha = Expression.Lambda>(block, value).Compile();


            int factorial = Expression.Lambda>(block, value).Compile()(5);


            Console.WriteLine("阶乘的结果:" + factorial);
            Console.ReadLine();
        }

        private static void MethodFour()
        {
            //可以看到表达式树主要由下面四部分组成:
            //1、Body 主体部分
            //2、Parameters 参数部分
            //3、NodeType 节点类型
            //4、Lambda表达式类型

            //将Lambda表达式转换为类型Expression的表达式树
            //exprTree不是可执行代码
            Expression> 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();
        }
    }

运行结果如图:

展开阅读全文

页面更新:2024-05-04

标签:表达式   阶乘   赋值   节点   变量   主体   参数   类型   代码   方法

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top