当前位置: 首页 > news >正文

c#通过ExpressionTree 表达式树实现对象关系映射

//反射+expression实现对象自动映射

void Main()
{Person p1=new(){Id=1,Name="abc"};var persondto = p1.MapTo<Person, PersonDto>();Console.WriteLine($"id:{persondto.Id}-name:{persondto.Name}");
}public static class AutoMapperExs
{
public static TDest MapTo<TSource, TDest>(this TSource source) where TSource : class, new() where TDest : class, new()
{//Expression<Func<Person, PersonDto>> exp = person => new PersonDto {Id=person.Id,Name=person.Name};
var destType = typeof(TDest);
var sourceType = typeof(TSource);
//1.创建参数表达式
var parameterExpression = Expression.Parameter(sourceType, "person");
//2.获取所有源类型的属性
var sourceProps = sourceType.GetProperties();
//保存所有属性的绑定关系
List<MemberBinding> list = new();
foreach (var sourceProp in sourceProps)
{
//3.创建成员表达式 person.Id,person.name
var memberExpression = Expression.Property(parameterExpression, sourceProp);
//成员绑定 Id=person.Id
var meberBingding = Expression.Bind(destType.GetProperty(sourceProp.Name), memberExpression);
list.Add(meberBingding);}
//5.创建对象表达式:new pesonDto()
var destExpression = Expression.New(destType);
//6.成员初始化表达式:new PersonDto{Id=person.Id,Name=person.Name}
var memberInitExpression = Expression.MemberInit(destExpression, list);
//7.创建最终的表达式
var expression = Expression.Lambda<Func<TSource, TDest>>(memberInitExpression, parameterExpression);
var compile = expression.Compile();
return compile.Invoke(source);
}
}class Person
{public int Id { get; set; }public string Name { get; set; }
}
class PersonDto
{public int Id { get; set; }public string Name { get; set; }
}
http://www.lryc.cn/news/296628.html

相关文章:

  • 《动手学深度学习(PyTorch版)》笔记7.2
  • 【MySQL进阶之路】BufferPool 生产环境优化经验
  • Vim工具使用全攻略:从入门到精通
  • Chapter 8 - 7. Congestion Management in TCP Storage Networks
  • 带你快速入门js高级-基础
  • 数据结构与算法-链表(力扣附链接)
  • 多线程JUC:等待唤醒机制(生产者消费者模式)
  • 无人机动力系统高倍率锂聚合物电池介绍,无人机锂电池使用与保养,无人机飞行控制动力源详解
  • [BeginCTF]真龙之力
  • 手写分布式存储系统v0.3版本
  • 除夕快乐!
  • 17:定时器编程实战
  • Fink CDC数据同步(五)Kafka数据同步Hive
  • ubuntu原始套接字多线程负载均衡
  • leetcode (算法)66.加一(python版)
  • DataX源码分析 TaskGroupContainer
  • 2024年华为OD机试真题-螺旋数字矩阵-Java-OD统一考试(C卷)
  • 红队打靶练习:PHOTOGRAPHER: 1
  • 【Linux】网络诊断 traceroute命令详解
  • c#cad 创建-圆(二)
  • 面试高频知识点:2线程 2.1.5如何自定义实现一个线程池
  • 【stm32】hal库学习笔记-ADC模数转换(超详细)
  • 蓝桥杯基础知识6 pair
  • 后端返回给前端的数据格式有哪些?
  • Transformer的PyTorch实现之若干问题探讨(一)
  • 系统参数SystemParameters.MinimumHorizontalDragDistance
  • 平屋顶安装光伏需要注意哪些事项?
  • 《Git 简易速速上手小册》第7章:处理大型项目(2024 最新版)
  • 从0开始学Docker ---Docker安装教程
  • 嵌入式学习之Linux入门篇笔记——15,Linux编写第一个自己的命令