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

寻技术 ASP.NET编程 2023年10月25日 90
  • LambdaExpression继承Expression

  • Expression又继承LambdaExpressio

所以,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);
            //创建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);

输出结果

关闭

用微信“扫一扫”