.NET写一个自己的Lambda表达式与表达式树

  • .NET写一个自己的Lambda表达式与表达式树已关闭评论
  • 196 次浏览
  • A+
所属分类:.NET技术
摘要

LambdaExpression继承Expression
Expression又继承LambdaExpressio
所以,Expression与 Expression的区别在于:泛型类以静态类型的方法标识了它是什么种类的表达式,也就是说,他确定了返回类型和参数。所以显然,TDelegate必须是一个委托类型。
注意:并非所有的Lambda表达式都能转换成表达式树。不能将带有一个语句块(即使只有一个return语句)的Lambda转换成表达式树,只有对单个表达式进行求值的lambda才可以。表达式中不能包含赋值操作,因为在表达式中表示不了这种操作。
形式一

  • LambdaExpression继承Expression
    .NET写一个自己的Lambda表达式与表达式树

  • Expression又继承LambdaExpressio
    .NET写一个自己的Lambda表达式与表达式树

所以,Expression与 Expression的区别在于:泛型类以静态类型的方法标识了它是什么种类的表达式,也就是说,他确定了返回类型和参数。所以显然,TDelegate必须是一个委托类型。
注意:并非所有的Lambda表达式都能转换成表达式树。不能将带有一个语句块(即使只有一个return语句)的Lambda转换成表达式树,只有对单个表达式进行求值的lambda才可以。表达式中不能包含赋值操作,因为在表达式中表示不了这种操作。
形式一

            //构建表达式树             Expression<Func<double,double,double>> distanceCalc=(x,y)=>Math.Sqrt(x*x+y*y);             double distanceResult = distanceCalc.Compile()(3,4);             Console.WriteLine(distanceResult); 

形式二

            //手动实现Lambda表达式             //所需方法             var sqrtMethod = typeof(Math).GetMethod("Sqrt", new[] { typeof(double) }) ?? throw new InvalidOperationException("Math.Sqrt not found!");             //参数             var xParameter = Expression.Parameter(typeof(double), "x");             var yParameter = Expression.Parameter(typeof(double), "y");             var xSquared = Expression.Multiply(xParameter, xParameter);             var ySquared = Expression.Multiply(yParameter, yParameter);             var sum = Expression.Add(xSquared, ySquared);             //创建MethodCallExpression             var distance = Expression.Call(sqrtMethod, sum);             //将call转换为lambda表达式             var distanceLambda = Expression.Lambda(                 distance,                 xParameter, yParameter);             var distanceFunc = (Func<double, double, double>)distanceLambda.Compile();             var res=distanceFunc(3, 4);             Console.WriteLine(res); 

输出结果
.NET写一个自己的Lambda表达式与表达式树