所以然 发表于 2023-7-10 11:09:35

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


[*]LambdaExpression继承Expression

[*]Expression又继承LambdaExpressio

所以,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);输出结果


来源:https://www.cnblogs.com/EsonLiu/archive/2023/07/10/17540449.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: .NET写一个自己的Lambda表达式与表达式树