c# Expression<Func<T, T>>转成实体

将 Expression<Func<T, T>>转成实体T

public class MyEntity
{public int Age { get; set; }public string Name { get; set; }
}
    public static class ExpressionExtension{#region 表达式类型字典/// <summary>/// 表达式类型字典/// </summary>private static readonly Dictionary<ExpressionType, string> NodeTypeDic = new Dictionary<ExpressionType, string>{{ExpressionType.AndAlso," AND "},{ExpressionType.OrElse," OR "},{ExpressionType.Equal," = "},{ExpressionType.NotEqual," != "},{ExpressionType.LessThan," < "},{ExpressionType.LessThanOrEqual," <= "},{ExpressionType.GreaterThan," > "},{ExpressionType.GreaterThanOrEqual," >= "}};#endregion#region 获取表达式类型转换结果/// <summary>/// 获取表达式类型转换结果/// </summary>/// <param name="node">二元表达式</param>/// <returns></returns>public static string GetExpressionType(this BinaryExpression node){var nodeTypeDic = NodeTypeDic[node.NodeType];string nodeType = null;if (node.Right.NodeType == ExpressionType.Constant && ((ConstantExpression)node.Right).Value == null){switch (node.NodeType){case ExpressionType.Equal:nodeType = " IS ";break;case ExpressionType.NotEqual:nodeType = " IS NOT ";break;}}return !string.IsNullOrEmpty(nodeType) ? nodeType : nodeTypeDic;}#endregion#region 获取最底层成员表达式/// <summary>/// 获取最底层成员表达式/// </summary>/// <param name="e"></param>/// <returns></returns>public static MemberExpression GetRootMember(this MemberExpression e){if (e.Expression == null || e.Expression.NodeType == ExpressionType.Constant)return e;return e.Expression.NodeType == ExpressionType.MemberAccess? ((MemberExpression)e.Expression).GetRootMember(): null;}#endregion#region 转换成一元表达式并取值/// <summary>/// 转换成一元表达式并取值/// </summary>/// <param name="expression"></param>/// <returns></returns>public static object ToConvertAndGetValue(this Expression expression){if (expression.Type != typeof(object))expression = Expression.Convert(expression, typeof(object));var lambdaExpression = Expression.Lambda<Func<object>>(expression);return lambdaExpression.Compile().Invoke();}#endregionpublic static object MemberToValue(this MemberExpression memberExpression){var topMember = GetRootMember(memberExpression);if (topMember == null)throw new InvalidOperationException("需计算的条件表达式只支持由 MemberExpression 和 ConstantExpression 组成的表达式");return memberExpression.MemberToValue(topMember);}public static object MemberToValue(this MemberExpression memberExpression, MemberExpression topMember){if (topMember.Expression == null){//var aquire = Cache.GetOrAdd(memberExpression.ToString(), key => GetStaticProperty(memberExpression));var aquire = GetStaticProperty(memberExpression);return aquire(null, null);}else{//var aquire = Cache.GetOrAdd(memberExpression.ToString(), key => GetInstanceProperty(memberExpression, topMember));var aquire = GetInstanceProperty(memberExpression, topMember);return aquire((topMember.Expression as ConstantExpression).Value, null);}}private static Func<object, object[], object> GetInstanceProperty(Expression e, MemberExpression topMember){var parameter = Expression.Parameter(typeof(object), "local");var parameters = Expression.Parameter(typeof(object[]), "args");var castExpression = Expression.Convert(parameter, topMember.Member.DeclaringType);var localExpression = topMember.Update(castExpression);var replaceExpression = ExpressionModifier.Replace(e, topMember, localExpression);replaceExpression = Expression.Convert(replaceExpression, typeof(object));var compileExpression = Expression.Lambda<Func<object, object[], object>>(replaceExpression, parameter, parameters);return compileExpression.Compile();}private static Func<object, object[], object> GetStaticProperty(Expression e){var parameter = Expression.Parameter(typeof(object), "local");var parameters = Expression.Parameter(typeof(object[]), "args");var convertExpression = Expression.Convert(e, typeof(object));var compileExpression = Expression.Lambda<Func<object, object[], object>>(convertExpression, parameter, parameters);return compileExpression.Compile();}public static string GetColumnAttributeName(this MemberInfo memberInfo){return memberInfo.GetCustomAttribute<ColumnAttribute>()?.Name ?? memberInfo.Name;}public static TEntity MapToEntity<TEntity>(this Expression<Func<TEntity, TEntity>> expression){TEntity entity = Activator.CreateInstance<TEntity>();// 确保传入的是Lambda表达式if (expression.NodeType != ExpressionType.Lambda)throw new ArgumentException("Expression must be a lambda expression", nameof(expression));// 获取Lambda表达式的主体,即单个MemberExpressionvar body = ((LambdaExpression)expression).Body;// 确保Lambda表达式的主体是MemberExpression类型if (body.NodeType != ExpressionType.MemberInit)throw new ArgumentException("Expression must be a member access", nameof(expression));// 获取成员信息var memberExpression = (MemberInitExpression)body;foreach (var binding in memberExpression.Bindings){MapMemberBinding(entity, binding);}return entity;}public static void MapMemberBinding<TEntity>(TEntity target, MemberBinding binding){if (binding is MemberAssignment memberAssignment){var property = typeof(TEntity).GetProperty(memberAssignment.Member.Name);if (property != null && property.CanWrite){if (ExpressionType.MemberAccess == memberAssignment.Expression.NodeType){var constantValue = ((MemberExpression)memberAssignment.Expression).MemberToValue();property.SetValue(target, constantValue);}else if (ExpressionType.Constant == memberAssignment.Expression.NodeType){var constantExpression = (ConstantExpression)memberAssignment.Expression;property.SetValue(target, constantExpression.Value);}}}}}public class ExpressionModifier : ExpressionVisitor{public ExpressionModifier(Expression newExpression, Expression oldExpression){_newExpression = newExpression;_oldExpression = oldExpression;}private readonly Expression _newExpression;private readonly Expression _oldExpression;public Expression Replace(Expression node){return Visit(node == _oldExpression ? _newExpression : node);}public static Expression Replace(Expression node, Expression oldExpression, Expression newExpression){return new ExpressionModifier(newExpression, oldExpression).Replace(node);}}

示例:

static void Main(string[] args)
{Expression<Func<MyEntity, MyEntity>> expression = (s) => new MyEntity{Age = 25,Name = "czj",};var entity = expression.MapToEntity<MyEntity>();var str = System.Text.Json.JsonSerializer.Serialize(entity);}

output:

{"Age":25,"Name":"czj"} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/54780.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DVWA-File Inclusion(文件包含)渗透测试

概念&#xff1a; 漏洞产生原因&#xff1a; 主要是由于开发人员没有对用户输入的文件路径进行严格的过滤和验证。例如&#xff0c;如果一个 Web 应用程序接受用户输入的文件路径&#xff0c;然后使用这个路径进行文件包含&#xff0c;而没有对用户输入进行任何检查&#xff0c…

传输层协议 --- UDP

序言 在之前的文章 Socket 编程 中&#xff0c;我们只是简单的知道了怎么利用 UDP协议 或者是 TCP协议 来发送我们的数据&#xff0c;并且我们还知道 UDP 是不可靠的&#xff0c;TCP 是可靠的。但这是为什么呢&#xff1f;底层的构造和策略决定他们的属性&#xff01;这篇文章中…

数据结构编程实践20讲(Python版)—01数组

本文目录 01 数组 arrayS1 说明S2 举例S3 问题&#xff1a;二维网格中的最小路径求解思路Python3程序 S4 问题&#xff1a;图像左右变换求解思路Python3程序 S5 问题&#xff1a;青蛙过河求解思路Python3程序 写在前面 数据结构是计算机科学中的一个重要概念&#xff0c;用于组…

HttpSession使用方法及原理

HttpSession使用方法及原理 一、HttpSession使用流程说明二、登录概述具体 三、访问过程概述具体 一、HttpSession使用流程说明 1.用户发送登录请求到服务器。 2.服务器处理登录请求&#xff0c;调用userService.login(loginUser)。 3.如果登录成功&#xff0c;服务器调用requ…

Linux云计算 |【第四阶段】NOSQL-DAY2

主要内容&#xff1a; Redis集群概述、部署Redis集群&#xff08;配置manage管理集群主机、创建集群、访问集群、添加节点、移除节点&#xff09; 一、Redis集群概述 1、集群概述 所谓集群&#xff0c;就是通过添加服务器的数量&#xff0c;提供相同的服务&#xff0c;从而让…

【echarts】报错series.render is required.

总结&#xff1a;就是echarts无法保存renderItem函数到json里&#xff0c;因为renderItem是个封装方法&#xff0c;因此需要初始化加载时重新插入renderItem即可 1.描述&#xff1a;控制台报错series.render is required. 原数据json如下&#xff1a; {type: "bar"…

工作安排 - 华为OD统一考试(E卷)

2024华为OD机试(C卷+D卷)最新题库【超值优惠】Java/Python/C++合集 题目描述 小明每周上班都会拿到自己的工作清单,工作清单内包含n项工作,每项工作都有对应的耗时时长(单位h)和报酬,工作的总报酬为所有已完成工作的报酬之和。那么请你帮小明安排一下工作,保证小明在指定…

科研绘图系列:R语言树结构聚类热图(cluster heatmap)

文章目录 介绍加载R包导入数据数据预处理画图修改图形导出数据系统信息介绍 热图结合树结构展示聚类结果通常用于展示数据集中的模式和关系,这种图形被称为聚类热图或层次聚类热图。在这种图中,热图部分显示了数据矩阵的颜色编码值,而树结构(通常称为树状图或聚类树)则显…

AIGAME背后的强大背景与AI币价值的崛起

AIGAME平台背后汇集了强大的资本和技术支持&#xff0c;凭借蒙特加密产业基金的战略投资和汇旺集团的多元化Web3基础设施建设&#xff0c;AIGAME在全球范围内迅速崛起。平台所使用的Sleepless AI技术&#xff0c;结合区块链与AI的深度融合&#xff0c;赋能AI币&#xff0c;使其…

虚拟社交的新时代:探索Facebook的元宇宙愿景

随着技术的不断进步&#xff0c;社交媒体的形态也在悄然变化。Facebook&#xff08;现名Meta&#xff09;正站在这一变革的前沿&#xff0c;积极探索元宇宙的愿景。元宇宙不仅是虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;的结合&#xff0c;更是…

遍历9个格子winmine!StepBlock和遍历8个格子winmine!StepBox的对决

遍历9个格子winmine!StepBlock和遍历8个格子winmine!StepBox的对决 第一部分&#xff1a;windbg调试记录。 0: kd> g Breakpoint 10 hit winmine!DoButton1Up: 001b:0100390e a130510001 mov eax,dword ptr [winmine!xCur (01005130)] 0: kd> kc # 00 winmine…

【RabbitMQ 项目】服务端:服务器模块

文章目录 一.编写思路二.代码实践三.服务端模块关系总结 一.编写思路 成员变量&#xff1a; muduo 库中的 TCP 服务器EventLoop 对象&#xff1a;用于主线程循环监控连接事件协议处理句柄分发器&#xff1a;用于初始化协议处理器&#xff0c;便于把不同请求派发给不同的业务处理…

Golang | Leetcode Golang题解之第433题最小基因变化

题目&#xff1a; 题解&#xff1a; func diffOne(s, t string) (diff bool) {for i : range s {if s[i] ! t[i] {if diff {return false}diff true}}return }func minMutation(start, end string, bank []string) int {if start end {return 0}m : len(bank)adj : make([][…

OpenHarmony标准系统mipi摄像头适配

OpenHarmony标准系统mipi摄像头适配 本文档以rk3568为例&#xff0c;讲述如何在OpenHarmony 标准系统rk设备上适配mipi摄像头。 开发环境 OpenHarmony标准系统4.1rrk3568设备摄像头ov5648,ov8858 文档约定&#xff1a;4.1r_3568为OpenHarmony标准系统源码根目录 1.适配准备:得…

树莓派pico上手

0 介绍 不同于作为单板计算机的树莓派5&#xff0c;树莓派 pico 是一款低成本、高性能的微控制器板&#xff0c;具有灵活的数字接口。主要功能包括&#xff1a; 英国树莓派公司设计的 RP2040 微控制器芯片双核 Arm Cortex M0 处理器&#xff0c;弹性的时钟频率高达 133 MHz26…

Spring AOP的应用

目录 1、maven坐标配置与xml头配置 2、代理方式的选择与配置 3、AOP的三种配置方式 3.1、XML模式 3.1.1 创建目标类和方法 3.1.2 创建切面 3.1.3 切面xml配置与表达式说明 3.1.4 单测 3.2 纯注解模式 3.2.1 开启注解相关配置 3.2.2 创建目标类和方法 3.2.3 创建切面…

FGPA实验——触摸按键

本文系列都基于正点原子新起点开发板 FPGA系列 1&#xff0c;verlog基本语法&#xff08;随时更新&#xff09; 2&#xff0c;流水灯&#xff08;待定&#xff09; 3&#xff0c;FGPA实验——触摸按键 一、触摸操作原理实现 分类&#xff1a;电阻式&#xff08;不耐用&…

二叉树进阶

目录 1. 二叉搜索树实现 1.1 二叉搜索树概念 2.2 二叉搜索树操作 ​编辑 ​编辑 2.3 二叉搜索树的实现 2.3.0 Destroy() 析构 2.3.1 Insert&#xff08;&#xff09;插入 2.3.2 InOrder&#xff08;&#xff09; 打印搜索二叉树 ​编辑​编辑 2.3.3 Find() 查找 …

el-table表格点击该行任意位置时也勾选上其前面的复选框

需求&#xff1a;当双击表格某一行任意位置时&#xff0c;自动勾选上其前面的复选框 1、在el-table 组件的每一行添加row-dblclick事件&#xff0c;用于双击点击 <el-table:data"tableData"ref"tableRef"selection-change"handleSelectionChange&q…

如何在Chrome最新浏览器中调用ActiveX控件?

小编最近登陆工商银行网上银行&#xff0c;发现工商银行的个人网银网页&#xff0c;由于使用了ActiveX安全控件&#xff0c;导致不能用高版本Chrome浏览器打开&#xff0c;目前只有使用IE或基于IE内核的浏览器才能正常登录网上银行&#xff0c;而IE已经彻底停止更新了&#xff…