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一起学”系列课程,帮助大家来构建知识框架,初步规划有:
“与LSGO一起学C++”;
“与LSGO一起学C#”;
“与LSGO一起学Matlab”;
“与LSGO一起学数据结构”;
“与LSGO一起学设计模式”;
“与LSGO一起学可视化建模语言(UML)”;
“与LSGO一起学线性代数”;
“与LSGO一起学高等数学”
“与LSGO一起学概率论与数理统计”;
“与LSGO一起学抽象代数;
“与LSGO一起学点集拓扑”
“与LSGO一起学数字图像处理”;
“与LSGO一起学智能计算”;
如果对这些内容感兴趣,可以一起来学习讨论。
我们的官网: www.lsgogroup.com
联系客服