打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
利用C#将Lambda表达式转化成Expression树

Lambda表达式不仅可以用来创建委托实例,C#编译器也能够将它们转换成表达式树。我们可以通过编译器把Lambda表达式转换成一个表达式树,并创建一个Expression<TDelegate>的一个实例。

代码演示1

using System;

using System.Linq.Expressions; 

namespace LambdaSample08

{

    class Program

    {

        static void Main(string[]args)

        {

            //将Lambda表达式转换为Expression<T>表达式树

            //Expression不是可执行代码

            Expression<Func<int, int, int>>expression = (a, b) => a + b;

            Console.WriteLine(expression);

            //获取Lambda表达式的主体

            BinaryExpressionbody = expression.Body as BinaryExpression;

            Console.WriteLine(body);

            //获取Lambda表达式的参数

            ParameterExpressionleft = body.Left as ParameterExpression;

            ParameterExpressionright = body.Right as ParameterExpression;

            Console.WriteLine("param1:{0}", expression.Parameters[0]);

            Console.WriteLine("param2:{0}", expression.Parameters[1]);

            Console.WriteLine("left body of expression:{0}",left.Name);

            Console.WriteLine("NodeType:{0}", body.NodeType);

            Console.WriteLine("right body of expression:{0}",right.Name);

            //将表达式树转换成委托并执行

            Func<int, int, int> addDelegate = expression.Compile();

            Console.WriteLine(addDelegate(10,16));

        }

    }

}

见代码:LambdaSample08.cs

代码演示2

using System;

using System.Linq.Expressions; 

namespace LambdaSample10

{

    class Program

    {

        static void Main(string[] args)

        {

           //表示 -a

           ParameterExpression a = Expression.Parameter(typeof(int), "a");

           UnaryExpression body = Expression.Negate(a);

           Expression<Func<int, int>> d = Expression.Lambda<Func<int, int>>(body, a);

           Func<int,int> f = d.Compile();

           Console.WriteLine(d.Body);

           Console.WriteLine(f(5));

        }

    }

}

见代码:LambdaSample10.cs

演示代码3

using System;

using System.Linq.Expressions; 

namespace LambdaSample11

{

    class Program

    {

        privatestatic voidMain(string[] args)

        {

            //表示 a+2*b

            ParameterExpressiona = Expression.Parameter(typeof(int), "a");

            ParameterExpressionb = Expression.Parameter(typeof(int), "b");

            ConstantExpressionc = Expression.Constant(2);

            BinaryExpressionbe1 = Expression.Multiply(c, b);

            BinaryExpressionbe2 = Expression.Add(a, be1);

            Expression<Func<int, int, int>> lamb= Expression.Lambda<Func<int, int, int>>(be2,a,b);

            Func<int, int, int> f = lamb.Compile();

            Console.WriteLine(lamb);

            Console.WriteLine(f(10,20));

        }

    }

}

见代码:LambdaSample11.cs

演示代码4

using System;

using System.Linq.Expressions; 

namespace LambdaSample09

{

    class Program

    {

        static void Main(string[]args)

        {

            //创建一个表达式树中的参数,作为一个结点,这里是最下层的结点

            ParameterExpressiona = Expression.Parameter(typeof(int), "i");

            ParameterExpressionb = Expression.Parameter(typeof(int), "j");

            BinaryExpressionbe = Expression.Multiply(a, b);

            ParameterExpressionc = Expression.Parameter(typeof(int), "w");

            ParameterExpressiond = Expression.Parameter(typeof(int), "x");

            BinaryExpressionbe1 = Expression.Multiply(c, d);

            //运算两个中级结点,产生终结点

            BinaryExpressionsu = Expression.Add(be, be1);

            Expression<Func<int, int, int, int, int>>lambda = Expression.Lambda<Func<int, int, int, int, int>>(su,a, b,

                                                                                                               c, d);

            Console.WriteLine(lambda);

            //将表达式树描述的Lambda表达式,编译为可执行代码,并生成该Lambda表达式的委托

            Func<int, int, int, int, int> f = lambda.Compile();

            Console.WriteLine(f(1,1, 1, 1));

        }

    }

}


通过微信学习的知识只能是碎片化的知识,作为新时代的我们希望能够构建自己的知识结构,使我们的知识体系化,系统化,以后在遇到碎片化的知识,我们做的只是融合到自己的知识结构中,故我们将推出“与LSGO一起学”系列课程,帮助大家来构建知识框架,初步规划有:

  1. “与LSGO一起学C++”;

  2. “与LSGO一起学C#”;

  3. LSGO一起学Matlab”;

  4. “与LSGO一起学数据结构”;

  5. “与LSGO一起学设计模式”;

  6. “与LSGO一起学可视化建模语言(UML)”;

  7. “与LSGO一起学线性代数”;

  8. “与LSGO一起学高等数学”

  9. “与LSGO一起学概率论与数理统计”;

  10. “与LSGO一起学抽象代数;

  11. “与LSGO一起学点集拓扑”

  12. “与LSGO一起学数字图像处理”;

  13. “与LSGO一起学智能计算”;

如果对这些内容感兴趣,可以一起来学习讨论。

我们的官网: www.lsgogroup.com

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
c#编程指南(二) LINQ表达式 (LINQ Expression)
C# Lambda表达式详解,及Lambda表达式树的创建
LINQ与DLR的Expression tree(5):用lambda表达式表示常见控制结构 (转 rednaxelafx.javaeye.com)
Linq之Expression进阶
由浅入深表达式树(一)
打造自己的LINQ Provider(上):Expression Tree揭秘
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服