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

C# 表达式树 (4)

作者: wwmin_ | 来源:发表于2021-01-26 21:42 被阅读0次

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

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

  • Break 创建一个表示 break 语句的 GotoExpression。结合Loop 和 IfThenElse 等循环判断语句
//Break   创建一个表示 break 语句的 GotoExpression。结合Loop 和 IfThenElse 等循环判断语句
    void BreakSample()
    {
        ParameterExpression valueBreak = Expression.Parameter(typeof(int), "value");
        ParameterExpression resultBreak = Expression.Parameter(typeof(int), "result");
        LabelTarget labelBreak = Expression.Label(typeof(int));
        BlockExpression blockBreak = Expression.Block(
            new[] { resultBreak },
            Expression.Assign(resultBreak, Expression.Constant(1)),
                Expression.Loop(
                    Expression.IfThenElse(
                        Expression.GreaterThan(valueBreak, Expression.Constant(1)),
                        Expression.MultiplyAssign(resultBreak,
                            Expression.PostDecrementAssign(valueBreak)),
                        Expression.Break(labelBreak, resultBreak)
                    ),
                labelBreak
            )
        );
        blockBreak.Expressions.ForEach(p =>
        {
            if (p is LoopExpression loopExpression) loopExpression.Body.ToString().Dump();
            //IIF((value > 1), (result *= value--), break UnnamedLabel_0 (result))
            else p.ToString().Dump();//(result = 1)
        });
        Expression.Lambda<Func<int, int>>(blockBreak, valueBreak).Compile()(5).Dump(); //120
        Expression callExpr = Expression.Call(
            Expression.New(typeof(SmapleClass)),
            typeof(SmapleClass).GetMethod("AddIntegers", new Type[] { typeof(int), typeof(int) })!,
            Expression.Constant(1),
            Expression.Constant(2)
            );
        callExpr.ToString().Dump();//new SmapleClass().AddIntegers(1, 2)
        Expression.Lambda<Func<int>>(callExpr).Compile()().Dump();//3
                                                                  //创建不带参数调用的表达式
        var callSampleStringExpr = Expression.Call(Expression.Constant("sample string"), typeof(String).GetMethod("ToUpper", new Type[] { })!);
        Expression.Lambda<Func<string>>(callSampleStringExpr).Compile()().Dump();//SAMPLE STRING
    }
    BreakSample();
  • Catch (类似与 TryCatch) 创建一个表示 catch 语句的 CatchBlock。
    //Catch  (类似与 TryCatch)  创建一个表示 catch 语句的 CatchBlock。
    void CatchSample()
    {
        TryExpression tryCatchExpr =
            Expression.TryCatch(
                Expression.Block(
                    Expression.Throw(Expression.Constant(new DivideByZeroException())),
                    Expression.Constant("try block")
                ),
                Expression.Catch(
                    typeof(DivideByZeroException),
                    Expression.Constant("catch block")
                )
            );
        Expression.Lambda<Func<string>>(tryCatchExpr).Compile()().Dump();//catch block
    }
    CatchSample();
  • ClearDebug 创建一个用于清除序列点的 DebugInfoExpression。 //TODO

  • Coalesce (?? 运算符) 创建一个表示合并运算的 BinaryExpression。

public class Person
{
    public string Name { get; set; } = null!;
    public string GetName() => this.Name;
    public string GetOrSetName(string name)
    {
        if (this.Name == null) this.Name = name;
        return this.Name;
    }
}


    //Coalesce (?? 运算符)   创建一个表示合并运算的 BinaryExpression。
    void CoalesceSample()
    {
        ParameterExpression varCoalesceExpr = Expression.Variable(typeof(string), "sampleVar");

        Expression callPersonNameExpr = Expression.Call(
            Expression.New(typeof(Person)),
            typeof(Person).GetMethod("GetName")!
            );

        var assignCoalesceNullExpr = Expression.Assign(varCoalesceExpr, Expression.Coalesce(callPersonNameExpr, Expression.Constant("??赋值成功")));

        var blockCoalesceExpr = Expression.Block(new ParameterExpression[] { varCoalesceExpr }, assignCoalesceNullExpr);
        blockCoalesceExpr.Expressions.ForEach(p => p.ToString().Dump());     //(sampleVar = (new Person().GetName() ?? "??赋值成功"))
        Expression.Lambda<Func<string>>(blockCoalesceExpr).Compile()().Dump();   // ??赋值成功
    }
    CoalesceSample();

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

相关文章

  • C# 表达式树 (4)

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

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

网友评论

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

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