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

C# 表达式树 (7)

作者: wwmin_ | 来源:发表于2021-01-29 23:23 被阅读0次

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

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

  • ElementInit 创建 ElementInit。
//ElementInit  创建 ElementInit。
    void ElementInitSample()
    {
        string tree = "maple";
        MethodInfo addMethod = typeof(Dictionary<int, string>).GetMethod("Add")!;
        ElementInit elementInit = Expression.ElementInit(addMethod, Expression.Constant(tree.Length), Expression.Constant(tree));
        elementInit.ToString().Dump();//Void Add(Int32, System.String)(5, "maple")
    }
    ElementInitSample();
  • Empty 创建具有 Void 类型的空表达式。
    //Empty 创建具有 Void 类型的空表达式。 
    //如果需要表达式,但不需要执行任何操作,则可以使用空表达式。 例如,你可以使用空表达式作为块表达式中的最后一个表达式。 在这种情况下,块表达式的返回值为 void。
    void EmptySample()
    {
        DefaultExpression emptyExpr = Expression.Empty();
        var emptyBlock = Expression.Block(emptyExpr);//return value is void
        emptyBlock.Expressions.ForEach(p => p.ToString().Dump());//default(Void)
    }
    EmptySample();
  • Equal 创建一个表示相等比较的 BinaryExpression。
    //Equal  创建一个表示相等比较的 BinaryExpression。
    void EqualSample()
    {
        Expression equalExpr = Expression.Equal(Expression.Constant(1, typeof(int)), Expression.Constant(2, typeof(int)));
        equalExpr.ToString().Dump();//(1 == 2)
        Expression.Lambda<Func<bool>>(equalExpr).Compile()().Dump();//False
    }
    EqualSample();
  • ExclusiveOr 创建一个表示按位 BinaryExpression 运算的 XOR。
    //ExclusiveOr    创建一个表示按位 BinaryExpression 运算的 XOR。
    void ExclusiveOrSample()
    {
        Expression exclusiveOrExpr = Expression.ExclusiveOr(Expression.Constant(5), Expression.Constant(3));
        // The XOR operation is performed as follows:
        // 101 xor 011 = 110
        exclusiveOrExpr.ToString().Dump();//(5 ^ 3)
        Expression.Lambda<Func<int>>(exclusiveOrExpr).Compile()().Dump();//6
    }
    ExclusiveOrSample();
  • ExclusiveOr 创建一个表示按位 BinaryExpression 运算的 XOR。
    //ExclusiveOr    创建一个表示按位 BinaryExpression 运算的 XOR。
    void ExclusiveOrAssignSample()
    {
        ParameterExpression varsample = Expression.Variable(typeof(int), "sampleVar");
        Expression assignExpr = Expression.Assign(varsample, Expression.Constant(5));
        Expression exclusiveOrAssignExpr = Expression.ExclusiveOrAssign(varsample, Expression.Constant(3));
        // The XOR operation is performed as follows:
        // 101 xor 011 = 110
        exclusiveOrAssignExpr.ToString().Dump();//(sampleVar ^= 3)
        var blockExpr = Expression.Block(new ParameterExpression[] { varsample }, assignExpr, exclusiveOrAssignExpr);
        Expression.Lambda<Func<int>>(blockExpr).Compile()().Dump();//6
    }
    ExclusiveOrAssignSample();
  • 创建一个表示访问字段的 MemberExpression
//创建一个表示访问字段的 MemberExpression
    void FieldSample()
    {
        TestFieldClass obj = new TestFieldClass();
        Expression fieldExpr = Expression.Field(Expression.Constant(obj), "num");
        fieldExpr.ToString().Dump();//value(Program+TestFieldClass).num
        Expression.Lambda<Func<int>>(fieldExpr).Compile()().Dump();//10

        //给字段赋值
        var assignExpr = Expression.Assign(fieldExpr, Expression.Constant(20));
        //带有返回值
        var blockWithReturnExpr = Expression.Block(fieldExpr, assignExpr);
        Expression.Lambda<Func<int>>(blockWithReturnExpr).Compile()().Dump("带有返回值的赋值操作");
        //不带有返回值
        var blockExpr = Expression.Block(fieldExpr, assignExpr, Expression.Empty());
        Expression.Lambda<Action>(blockExpr).Compile()();//20
        obj.num.Dump();
    }
    FieldSample();

    //GetActionType(Type[])    创建一个 Type 对象,该对象表示具有特定类型参数的泛型 System.Action 委托类型。//TODO

    //GetDelegateType(Type[])  获取一个 Type 对象,表示具有特定类型参数的泛型 System.Func 或 System.Action 委托类型。//TODO

    //GetFuncType(Type[])   创建一个 Type 对象,该对象表示System.Func具有特定类型参数的泛型 system.exception 委托类型。 最后一个类型参数指定已创建委托的返回类型。//TODO

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

相关文章

  • C# 表达式树 (7)

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

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

  • C# 表达式树 (14)

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

  • C# 表达式树 (12)

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

网友评论

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

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