标签:blog io ar div sp art cti on c
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Linq.Expressions; namespace TestExpressionLambda { class ProgramExpression { static void Main(string[] args) { ExpressionAdd(); ExpressionFromlambda(); ExpressionStartWith(); Console.Read(); } /// <summary> /// 最简单的加法表达式树 /// /// 根节点 /// BanaryExpression /// NodeType = Add /// Type=System.Int32 /// /// 左叶子 右叶子 /// firstArg secondArg /// ConstantExpression ConstantExpression /// NodeType=Constant NodeType=Constant /// Type=System.Int32 Type=System.Int32 /// Value=3 Value=2 /// /// /// </summary> private static void ExpressionAdd() { //构建常量表达式3 ConstantExpression firstArg = Expression.Constant(3); //构建常量表达式2 ConstantExpression secondArg = Expression.Constant(2); //构建+表达式 3+2 BinaryExpression add = Expression.Add(firstArg, secondArg); Console.WriteLine(add);//输出 : (3+2) //获取委托表达式 Expression<Func<int>> addExpression = Expression.Lambda<Func<int>>(add); //Compile出委托,内部调用了emit去构造il Func<int> addFunc = addExpression.Compile(); Console.WriteLine(addFunc);//输出System.Func~1[Int32] Console.WriteLine(addFunc());//输出执行的结果:5 } /// <summary> /// 简单从lambda创建表达式树 /// ps:不能讲带有语句块的lambda转换成表达式树 /// </summary> private static void ExpressionFromlambda() { Expression<Func<int>> lambadExpression = () => 3 + 2; Func<int> lambdaFunc = lambadExpression.Compile(); Console.WriteLine(lambdaFunc); Console.WriteLine(lambdaFunc()); } /// <summary> /// 表达式树去调用string类型的StartWith方法 /// 要实现类型lambda表达式:(x,y) => x.StartsWith(y) /// </summary> private static void ExpressionStartWith() { //反射取到string的StartsWith方法 MethodInfo method = typeof(string).GetMethod("StartsWith", new[] { typeof(string) }); //取参数表达式:x,y ParameterExpression x = Expression.Parameter(typeof(string), "x"); ParameterExpression y = Expression.Parameter(typeof(string), "y"); //StartsWith方法需要的参数 Expression[] methodArgs = new[] { y }; //生成调用表达式 MethodCallExpression call = Expression.Call(x, method, y); var lambdaParameters = new[] { x, y }; //Expression.Lambda方法生成表达式树委托 Expression<Func<string, string, bool>> lambda = Expression.Lambda<Func<string, string, bool>>(call, lambdaParameters); //Compile出委托 Func<string, string, bool> func = lambda.Compile(); Console.WriteLine(func("First", "Second")); Console.WriteLine(func("First", "Fir")); } } }
标签:blog io ar div sp art cti on c
原文地址:http://www.cnblogs.com/12taotie21/p/3991659.html