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

C# 表达式树 (1)

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

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

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

    • Add(Expression, Expression) 创建一个表示不进行溢出检查的算术加法运算的
    public class Plus
    {
        //下面表达式指定加法的实现
        public static int AddOne(int a, int b)
        {
            return a + b + 1;
        }
    }
    //Add(Expression, Expression)    创建一个表示不进行溢出检查的算术加法运算的 BinaryExpression。
        void AddSample()
        {
            Expression sumExpr = Expression.Add(Expression.Constant(1), Expression.Constant(2));
            Console.WriteLine(sumExpr.ToString());//(1+2)
            Console.WriteLine(Expression.Lambda<Func<int>>(sumExpr).Compile()());//3
            Expression sumExpr2 = Expression.Add(Expression.Constant(1), Expression.Constant(2), typeof(Plus).GetMethod("AddOne"));
            Console.WriteLine(sumExpr2.ToString());
            Console.WriteLine(Expression.Lambda<Func<int>>(sumExpr2).Compile()());
        }
        AddSample();
    
    • AddAssign(Expression, Expression) 创建一个表示不进行溢出检查的加法赋值运算的 BinaryExpression
        //AddAssign(Expression, Expression) 创建一个表示不进行溢出检查的加法赋值运算的 BinaryExpression
        void AddAssignSample()
        {
            ParameterExpression variableExpr = Expression.Variable(typeof(int), "sampleVar");//the parameter expression is used to create a variable;
            BlockExpression addAssignExpr = Expression.Block(
            new ParameterExpression[] { variableExpr },
            Expression.Assign(variableExpr, Expression.Constant(1)),
            Expression.AddAssign(
                variableExpr,
                Expression.Constant(2)
                )
            );
            addAssignExpr.Expressions.ForEach(p => p.ToString().Dump());//(sampleVar = 1),(sampleVar +=2)
            Console.WriteLine(Expression.Lambda<Func<int>>(addAssignExpr).Compile()());//3
        }
        AddAssignSample();
    
    • AddAssign(Expression, Expression, MethodInfo) 创建一个表示不进行溢出检查的加法赋值运算的 BinaryExpression。可指定实现
        //AddAssign(Expression, Expression, MethodInfo)  创建一个表示不进行溢出检查的加法赋值运算的 BinaryExpression。可指定实现
        //参Add(Expression, Expression, MethodInfo)
    
        //AddAssign(Expression, Expression, MethodInfo, LambdaExpression) 创建一个表示不进行溢出检查的加法赋值运算的 BinaryExpression。可指定实现, 可指定类型转换函数
    
    
    • AddAssignChecked(Expression, Expression) 创建一个表示进行溢出检查的加法赋值运算的 BinaryExpression。
        //AddAssignChecked(Expression, Expression)    创建一个表示进行溢出检查的加法赋值运算的 BinaryExpression。
        void AddAssignCheckedSample()
        {
            ParameterExpression variableExprWithChecked = Expression.Variable(typeof(int), "sampleVar");//the parameter expression is used to create a variable;
            BlockExpression addAssignExprWithChecked = Expression.Block(
            new ParameterExpression[] { variableExprWithChecked },
            Expression.Assign(variableExprWithChecked, Expression.Constant(2147483647)),
            Expression.AddAssign(
                variableExprWithChecked,
                Expression.Constant(1)
                )
            );
            addAssignExprWithChecked.Expressions.ForEach(p => p.ToString().Dump());//(sampleVar = 2147483647),(sampleVar +=1)
            Console.WriteLine(Expression.Lambda<Func<int>>(addAssignExprWithChecked).Compile()());//-2147483648
        }
        AddAssignCheckedSample();
    
        //AddChecked(Expression, Expression)    创建一个表示进行溢出检查的算术加法运算的 BinaryExpression。
        //同Add
    

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

    相关文章

      网友评论

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

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