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

C# 表达式树 (11)

作者: wwmin_ | 来源:发表于2021-02-02 21:59 被阅读0次

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

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

    • Loop 创建一个 LoopExpression。
    //Loop     创建一个 LoopExpression。
        void LoopSample()
        {
            ParameterExpression value = Expression.Parameter(typeof(int), "value");
            // Creating an expression to hold a local variable.
            ParameterExpression result = Expression.Parameter(typeof(int), "result");
            // Creating a label to jump to from a loop.
            LabelTarget label = Expression.Label(typeof(int));
            // Creating a method body.
            BlockExpression block = Expression.Block(
                new[] { result },
                Expression.Assign(result, Expression.Constant(1)),
                    Expression.Loop(
                       Expression.IfThenElse(
                           Expression.GreaterThan(value, Expression.Constant(1)),
                           Expression.MultiplyAssign(result,
                               Expression.PostDecrementAssign(value)),
                           Expression.Break(label, result)
                       ),
                   label
                )
            );
            // Compile and run an expression tree.
            int factorial = Expression.Lambda<Func<int, int>>(block, value).Compile()(5);
            Console.WriteLine(factorial);//120
        }
        LoopSample();
    
    • MakeBinary 通过调用适当的工厂方法来创建一个 BinaryExpression。
        //MakeBinary    通过调用适当的工厂方法来创建一个 BinaryExpression。
        void MakeBinarySample()
        {
            System.Linq.Expressions.BinaryExpression binaryExpression =
                System.Linq.Expressions.Expression.MakeBinary(
                    System.Linq.Expressions.ExpressionType.Subtract,
                    System.Linq.Expressions.Expression.Constant(53),
                    System.Linq.Expressions.Expression.Constant(14));
    
            Console.WriteLine(binaryExpression.ToString());//(53 - 14)
        }
        MakeBinarySample();
    
        //MakeCatchBlock    创建一个表示具有指定元素的 catch 语句的 CatchBlock。 //TODO
    
        //MakeDynamic    创建一个表示动态操作的 DynamicExpression。//TODO
    
        //MakeGoto    创建一个 GotoExpression,它表示指定的 GotoExpressionKind 的跳转。 也可以指定在跳转时传递给标签的值。//TODO
    
        //MakeIndex   创建一个 IndexExpression,它表示访问对象中的索引属性。//TODO
    
        //MakeMemberAccess    创建一个表示访问字段或属性的 MemberExpression。//TODO
    
        //MakeTry     创建一个表示具有指定元素的 try 块的 TryExpression。//TODO
    
        //MakeUnary   通过调用适当的工厂方法来创建一个 UnaryExpression。  //TODO
    
        //MemberBind  创建一个表示递归初始化某个成员的成员的 MemberMemberBinding。//TODO
    
    • MemberInit 表示一个表达式,该表达式创建新对象并初始化该对象的一个属性。
    //Field     创建一个表示访问字段的 MemberExpression。
    public class TestFieldClass
    {
        public int num = 10;
    }
        //MemberInit  表示一个表达式,该表达式创建新对象并初始化该对象的一个属性。
        void MemberInitSample()
        {
            // This expression creates a new TestMemberInitClass object
            // and assigns 10 to its num property.
            Expression testExpr = Expression.MemberInit(
                Expression.New(typeof(TestFieldClass)),
                new List<MemberBinding>() {
                Expression.Bind(typeof(TestFieldClass).GetMember("num")[0], Expression.Constant(10))
                }
            );
    
            var tree = Expression.Lambda<Func<TestFieldClass>>(testExpr).Compile();
            var test = tree();
            Console.WriteLine(test.num);//10
        }
        MemberInitSample();
    
    • Modulo 创建一个表示算术余数运算的 BinaryExpression。
        //Modulo   创建一个表示算术余数运算的 BinaryExpression。
        void ModuloSample()
        {
            Expression sumExpr = Expression.Modulo(Expression.Constant(3), Expression.Constant(2));
            Console.WriteLine(sumExpr.ToString());//(3%2)
            Expression.Lambda<Func<int>>(sumExpr).Compile()().Dump("ModuloAssign 余数运算");//1
        }
        ModuloSample();
    
    • ModuloAssign 创建一个表示余数赋值运算的 BinaryExpression。
        //ModuloAssign   创建一个表示余数赋值运算的 BinaryExpression。
        void ModuloAssignSample()
        {
            ParameterExpression variableExpr = Expression.Variable(typeof(int), "sampleVar");
            BlockExpression block = Expression.Block(
                new ParameterExpression[] { variableExpr },
                Expression.Assign(variableExpr, Expression.Constant(3)),
                Expression.ModuloAssign(
                    variableExpr,
                    Expression.Constant(2)
                )
            );
            block.Expressions.ForEach(p => p.ToString().Dump());//(sampleVar = 3)  | (sampleVar %= 2)
            Expression.Lambda<Func<int>>(block).Compile()().Dump("ModuloAssign 余数赋值运算");//1
        }
        ModuloAssignSample();
    

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

    相关文章

      网友评论

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

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