一.构建表达式树
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);参数列表(只有一个参数)