- A+
所属分类:.NET技术
-
LambdaExpression继承Expression
-
Expression
又继承LambdaExpressio
所以,Expression与 Expression
注意:并非所有的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);
输出结果