Lambda表達式不僅可以用來(lái)創(chuàng )建委托實(shí)例,C#編譯器也能夠將它們轉換成表達式樹(shù)。我們可以通過(guò)編譯器把Lambda表達式轉換成一個(gè)表達式樹(shù),并創(chuàng )建一個(gè)Expression<TDelegate>的一個(gè)實(shí)例。
代碼演示1:
using System;
using System.Linq.Expressions;
namespace LambdaSample08
{
class Program
{
static void Main(string[]args)
{
//將Lambda表達式轉換為Expression<T>表達式樹(shù)
//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);
//將表達式樹(shù)轉換成委托并執行
Func<int, int, int> addDelegate = expression.Compile();
Console.WriteLine(addDelegate(10,16));
}
}
}
見(jiàn)代碼: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));
}
}
}
見(jiàn)代碼: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));
}
}
}
見(jiàn)代碼:LambdaSample11.cs
演示代碼4:
using System;
using System.Linq.Expressions;
namespace LambdaSample09
{
class Program
{
static void Main(string[]args)
{
//創(chuàng )建一個(gè)表達式樹(shù)中的參數,作為一個(gè)結點(diǎn),這里是最下層的結點(diǎn)
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);
//運算兩個(gè)中級結點(diǎn),產(chǎn)生終結點(diǎn)
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);
//將表達式樹(shù)描述的Lambda表達式,編譯為可執行代碼,并生成該Lambda表達式的委托
Func<int, int, int, int, int> f = lambda.Compile();
Console.WriteLine(f(1,1, 1, 1));
}
}
}
通過(guò)微信學(xué)習的知識只能是碎片化的知識,作為新時(shí)代的我們希望能夠構建自己的知識結構,使我們的知識體系化,系統化,以后在遇到碎片化的知識,我們做的只是融合到自己的知識結構中,故我們將推出“與LSGO一起學(xué)”系列課程,幫助大家來(lái)構建知識框架,初步規劃有:
“與LSGO一起學(xué)C++”;
“與LSGO一起學(xué)C#”;
“與LSGO一起學(xué)Matlab”;
“與LSGO一起學(xué)數據結構”;
“與LSGO一起學(xué)設計模式”;
“與LSGO一起學(xué)可視化建模語(yǔ)言(UML)”;
“與LSGO一起學(xué)線(xiàn)性代數”;
“與LSGO一起學(xué)高等數學(xué)”
“與LSGO一起學(xué)概率論與數理統計”;
“與LSGO一起學(xué)抽象代數;
“與LSGO一起學(xué)點(diǎn)集拓撲”
“與LSGO一起學(xué)數字圖像處理”;
“與LSGO一起學(xué)智能計算”;
如果對這些內容感興趣,可以一起來(lái)學(xué)習討論。
我們的官網(wǎng): www.lsgogroup.com
聯(lián)系客服