美文网首页
C# 表达式树 (9)

C# 表达式树 (9)

作者: wwmin_ | 来源:发表于2021-01-31 16:43 被阅读0次

    系列文章: C# 表达式树及其应用 (Expression 类)

    本节继续讲解Expression相关的API, 力争把相关api 都使用简短demo说明一下

    • Label 创建一个表示标签的 LabelTarget。
    //Label     创建一个表示标签的 LabelTarget。
        void LabelSample()
        {
            LabelTarget returnTarget = Expression.Label();
            BlockExpression blockExpr =
                Expression.Block(
                    Expression.Call(typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) })!, Expression.Constant("Return")),
                    Expression.Return(returnTarget),
                    Expression.Call(typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) })!, Expression.Constant("Other Work")),
                    Expression.Label(returnTarget)
                );
            Expression.Lambda<Action>(blockExpr).Compile()();//Return
        }
        LabelSample();
    
    • Lambda 创建一个表示 Lambda 表达式的表达式树。
        //Lambda   创建一个表示 Lambda 表达式的表达式树。
        void LambdaSample()
        {
            ParameterExpression paramExpr = Expression.Parameter(typeof(int), "arg");
            LambdaExpression lambdaExpr = Expression.Lambda(
                Expression.Add(
                    paramExpr,
                    Expression.Constant(1)
                ),
                new List<ParameterExpression>() { paramExpr }
            );
    
            lambdaExpr.ToString().Dump("Lambda");//arg => (arg + 1)
            Console.WriteLine(lambdaExpr.Compile().DynamicInvoke(1));//2
        }
        LambdaSample();
    
    • LeftShift 创建一个表示按位左移(<<)运算的 BinaryExpression。
        //LeftShift  创建一个表示按位左移(<<)运算的 BinaryExpression。
        //按位左移:将第一个操作数向左移动第二个操作数指定的位数,空出的位置补0。
        //解释:左移相当于乘. 左移一位相当于乘2;左移两位相当于乘4;左移三位相当于乘8。x<<1=x*2
        //同理:右移相当于整除. 右移一位相当于除以2;右移两位相当于除以4;右移三位相当于除以8。x>>1=x/2
    
        void LeftShiftSample()
        {
            ParameterExpression paramExpr = Expression.Parameter(typeof(int), "arg");
            ParameterExpression paramExpr2 = Expression.Parameter(typeof(int), "num");
            LambdaExpression lambdaExpr = Expression.Lambda(
                Expression.LeftShift(
                    paramExpr,
                    paramExpr2
                ),
                new List<ParameterExpression>() { paramExpr, paramExpr2 }
             );
            lambdaExpr.ToString().Dump();//(arg, num) => (arg << num)
            lambdaExpr.Compile().DynamicInvoke(1, 2).Dump("LeftShift");//4
        }
        LeftShiftSample();
    
    • LeftShiftAssign 创建一个表示按位左移赋值(<<=)运算的 BinaryExpression。
        //LeftShiftAssign    创建一个表示按位左移赋值(<<=)运算的 BinaryExpression。
        void LeftShiftAssignSample()
        {
            ParameterExpression varsample = Expression.Variable(typeof(int), "sampleVar");
            Expression assignExpr = Expression.Assign(varsample, Expression.Constant(1));
            Expression exclusiveOrAssignExpr = Expression.LeftShiftAssign(varsample, Expression.Constant(3));
            exclusiveOrAssignExpr.ToString().Dump();//(sampleVar <<= 3)
            var blockExpr = Expression.Block(new ParameterExpression[] { varsample }, assignExpr, exclusiveOrAssignExpr);
            Expression.Lambda<Func<int>>(blockExpr).Compile()().Dump("LeftShiftAssign");//8
        }
        LeftShiftAssignSample();
    
    
    • LessThan 创建一个表示“小于”数值比较的 BinaryExpression。
        //LessThan   创建一个表示“小于”数值比较的 BinaryExpression。
        void LessThanSample()
        {
            //静态编译方式
            Expression lessThanExpr = Expression.LessThan(
                Expression.Constant(42),
                Expression.Constant(42)
            );
            Expression.Lambda<Func<bool>>(lessThanExpr).Compile()().Dump("LessThan");//false
    
            //动态参数方式
            ParameterExpression paramNum1 = Expression.Parameter(typeof(int), "num1");
            ParameterExpression paramNum2 = Expression.Parameter(typeof(int), "num2");
            LambdaExpression lambdaExpr = Expression.Lambda(
                Expression.LessThan(
                    paramNum1,
                    paramNum2
                ),
                new List<ParameterExpression>() { paramNum1, paramNum2 }
             );
            lambdaExpr.ToString().Dump();//(num1, num2) => (num1 < num2)
            lambdaExpr.Compile().DynamicInvoke(1, 3).Dump("LessThanDynamic");//true
        }
        LessThanSample();
    

    本文作者:wwmin
    微信公众号: DotNet技术说
    本文链接:https://www.jianshu.com/p/623ea39f46d1
    关于博主:评论和私信会在第一时间回复。或者[直接私信]我。
    版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
    声援博主:如果您觉得文章对您有帮助,关注点赞, 您的鼓励是博主的最大动力!

    相关文章

      网友评论

          本文标题:C# 表达式树 (9)

          本文链接:https://www.haomeiwen.com/subject/koertltx.html