首页 > 其他分享 >.NET写一个自己的Lambda表达式与表达式树

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

时间:2023-07-10 11:25:27浏览次数:32  
标签:double yParameter var NET Expression 表达式 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);

输出结果

标签:double,yParameter,var,NET,Expression,表达式,Lambda
From: https://www.cnblogs.com/EsonLiu/p/17540449.html

相关文章

  • abc065d <贪心+最小生成树> [lambda表达式]
    D-Built?//https://atcoder.jp/contests/abc065/tasks/arc076_b//贪心+最小生成树//关键在于意识到,连接x或y相邻的边代价最小,因而无需考虑全部的边,仅需考虑这些相邻边即可(贪心)//学习://1.lambda写法https://www.cnblogs.com/yaya12138/p/11815475.html//......
  • .Net Core Jwt鉴权授权
    目录简介基于.NetCore验证方式Jwt获取Token引入三方包生成TokenUserInfoJwtConfigWebApi测试(获取Token)Program.csappsetting.jsonController.NetCore验证(webApi)ProgarmContorller.NetCore授权简介Program.csJwtAuthorization.cs注意Autofac注册授权服务Controller注意......
  • dotnet nuget的命令行上传(推送/发布)包到Nexus 3
    1、让VisualStudio在生成的时候也生成NuGet的包在项目上点右键,选“属性”,然后设置生成的时候制作NuGet的包。英文版在这里打勾:中文版在这里打勾:重新生成后,在bin\debug目录下,就能看到我们的包。2、去Nexus3服务器,查看仓库的URL从下图看到,我们在前面文章中,创建的名为study的NuGet......
  • Kubernetes安全框架
    Kubernetes安全框架K8S安全控制框架主要由下面3个阶段进行控制,每一个阶段都支持插件方式,通过APIServer配置来启用插件。Authentication(鉴权):身份鉴别,只有正确的账号才能够通过认证Authorization(授权):判断用户是否有权限对访问的资源执行特定的动作AdmissionControl(准入......
  • 匿名函数(lambda表达式)01
    匿名函数顾名思义就是没有名字的函数。匿名函数是一种没有函数名的函数,也称为"lambda函数"。它是一种简洁的函数定义方式,可以在需要函数对象的任何地方使用,并且通常用于简化代码或作为其他函数的参数。语法1lambdaarguments:expression其中,arguments是函数的参数列表,而......
  • .NET 个人博客-发送邮件优化
    个人博客-发送邮件优化......
  • .Net Core ActionFilter
    目录作用实现IActionFilterIAsyncActionFilterActionFilterAttributeAopAction执行过滤器代码Action代码使用日志Action全局注册Program.cs作用在请求AuthorizeFilter->ResourceFilter->ActionFilter,可以记录Action的日志ActionFilter在控制器实例化之后执行Resour......
  • Net 编译器平台--- Roslyn Scripting APIs
    引言上一篇中.Net编译器平台---Roslyn,介绍了Roslyn的各项功能,包括公开API,使用语法,使用语义,使用工作区等功能。那么回到上一篇中提到的问题,实现类似这样的功能(以下代码为伪代码):stringscriptText="inta=1;intb=2;returna+b;";varresult=Script.Run(scriptTex......
  • 03-kubeadm初始化Kubernetes集群
    集群部署架构规划:节点网络:192.168.1.0/24Service网络:10.96.0.0/12Pod网络:10.244.0.0/16  部署方法参考:https://github.com/kuberneteskop方式:AWS(AmazonWebServices)andGCE(GoogleCloudPlatform)arecurrentlyofficiallysupportedkubeadm方式:https://github.com......
  • .net core 6.0 mvc js对文件分片上传文件+控制器合并文件保存
    js,通过ajax将文件分片提交  遇到问题:.netcore6.0mvc上传文件位置主文件夹下的\bin\Debug\net6.0 文件访问不了问题在startup配置#region让upload文件夹可以外部访问stringsUploadPath="/upload";stringsFDir=ToolsBasic.UsPath(sUploadPath);if(!Direc......