美文网首页
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)

    系列文章: C# 表达式树及其应用 (Expression 类)[https://www.jianshu.com/...

  • C# 表达式树 (3)

    系列文章: C# 表达式树及其应用 (Expression 类)[https://www.jianshu.com/...

  • C# 表达式树 (6)

    系列文章: C# 表达式树及其应用 (Expression 类)[https://www.jianshu.com/...

  • C# 表达式树 (2)

    系列文章: C# 表达式树及其应用 (Expression 类)[https://www.jianshu.com/...

  • C# 表达式树 (1)

    系列文章: C# 表达式树及其应用 (Expression 类)[https://www.jianshu.com/...

  • C# 表达式树 (4)

    系列文章: C# 表达式树及其应用 (Expression 类)[https://www.jianshu.com/...

  • C# 表达式树 (5)

    系列文章: C# 表达式树及其应用 (Expression 类)[https://www.jianshu.com/...

  • C# 表达式树 (7)

    系列文章: C# 表达式树及其应用 (Expression 类)[https://www.jianshu.com/...

  • C# 表达式树 (14)

    系列文章: C# 表达式树及其应用 (Expression 类)[https://www.jianshu.com/...

  • C# 表达式树 (12)

    系列文章: C# 表达式树及其应用 (Expression 类)[https://www.jianshu.com/...

网友评论

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

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