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

LambdaExpression继承Expression

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

Expression又继承LambdaExpressio

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

所以,LambdaExpression与 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);//创建MethodCallExpressionvar 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表达式与表达式树