表达式树

一.构建表达式树

1.简单例子:

Expression first=Expression.Constant(2);

Expression first=Expression.Constant(3);

Expression add=Expression.Constant(first,second);

Console.WriteLine(add);

输出:(2+3)

注意:“叶”表达式在代码中是最先创建的:你自下而上构建了这些表达式。这是由“表达式不易变”这一事实决定的---创建好表达式后,他就是永远不会改变。这样就可以随心所欲地缓存和重用表达式

Expression first=Expression.Constant(2);

Expression second=Expression.Constant(3);

Expression add=Expression.Add(first,second);

Func<int>compliled=Expression.Lambda<Func<int>>(add).Complile();

Console.WriteLine(compile());

输出:5

我们在程序中创建了一些逻辑快,将他表示成为普通的对象,然后编译程可以执行的“真实代码”。帮助我们理解LINQ是怎么工作的。

二.将C#Lambda表达式转换成为表达式树

1.用Lambda表达式创建表达式树

Expression<Func<int>>return5=()=>5;

Func<int>complied=return5.Compile();

Console.WriteLine(compile());

在表达式树中表达不了一个赋值的操作,只有单个Lambda表达式才能转换表达式树,这些事表达式树的常见的限制

2.复杂的表达式树

Expression<Func<string,string,bool>>expression=(x,y)=>s.StartsWith(y);

var compile=expression.Compile();

Console.WriteLine(compline("first","second"));

Console.WriteLine(compile("First","Second"));

接下来转换成为LambdaExpression的实例

用代码来构造一个方法调用表达式树

//构造方法调用的各个部件

MethodInfo method=typeof(string).GetMethod("StartsWith",new[](typeof(string)));

vare target=Expression.Parameter(typeof(string),"x");

var methodArg=Expression.Parameter(typeof(string),"y");

Expression[]methodArgs=new[](methodArg);

//从以上部件创建CallExpression

Expresion call=Expression.Call(target,method,methodArgs);

 

//将Call转换成为Lambda表达式

 

//构建方法参数

var lambdaParameters=new[](taget,methodArg);

//组建好表达式树

var lambda=Expression.Lambda<Func<string,string,bool>>(call,lambdaParameters);

//编译成为一个“真实”的代码

var compile=lambda.Compliled();

//进行调用

Console.WriteLine(complied("first","second"));

Console.WriteLine(compliled("First","Second"));

我们需要知道方法调用的几个部件,其中包括:方法的目标(也就是调用StartsWith的字符串);方法本身(MethodInfo);参数列表(只有一个参数)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值