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

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