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

    系列文章: 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# 表达式树 (9)

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

  • C# 表达式树 (14)

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

网友评论

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

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