以前做过Object到Object的转换方法的封装,底层主要还是靠反射取值赋值+循环来实现的。最近在公司里维护旧系统,这个系统使用了WCF,当时就很好奇他们的数据契约到实体模型的转换时怎么做的,之后查看源码,发现他们居然是一个属性一个属性的赋值过来的,当时就给我雷到了,难道就没有人举得这个地方可以封装起来吗?
据我目前了解,有三种方法可以实现这个实体类到实体类的转换过程,下面来简述下这三种方式。
第一种,也是最简单的一种,是用list自带的转换方法,但是这种方法需要自己定义转换规则,写起来也挺麻烦的,所以当时只做了个小Demo给大家看,也没有提倡使用;
第二种,就是用反射+泛型封装的方法,但是这种方法只能实现简单属性的转换,对于复杂对象的处理就会出现属性赋值方面的问题;
第三种方法,就是使用微软封装的AutoMapper。
接下来,本文主要简单介绍下AutoMapper的使用。
一,引入
首先找到“程序包管理器控制台”:
然后输入:
之后使用的时候,还有加入如下using:
using AutoMapper; //使用autoMapper需要引入此命名空间
接下来我们来写两个类,并写出两个类具体是如何转换的:
源类:
public class Student { public int ID;//ID public string Name;//姓名 public string Sex;//性别 }
目标类;
public class StudentGoal { public int ID;//ID public string Name;//姓名 public string Sex;//性别 }
接下来看看单个实体之间的转换和List之间的转换:
#region 单个实体之间的转换Demo //创建映射规则 Mapper.CreateMap<Student, StudentGoal>(); //创建一个源实体 Student StuScource = new Student { ID = 1, Name = "lhc", Sex = "girl" }; //进行转换:将源目标转换为目的目标 var sGoal = Mapper.Map<StudentGoal>(StuScource); //输出转换后实体name Console.WriteLine(sGoal.Name); #endregion #region List之间的转换Demo //创建转换规则 Mapper.CreateMap<Student, StudentGoal>(); //创建源实体集合 List<Student> ListScource = new List<Student>() { new Student() {ID=1,Name ="刘慧超",Sex ="女"}, new Student() {ID=2,Name ="小七七",Sex ="女"} }; //进行转换 List<StudentGoal> ListGoal = Mapper.Map<List<Student>, List<StudentGoal>>(ListScource); //输出目标集合中学生姓名 foreach (var stu in ListGoal ) { Console.WriteLine(stu.Name); } #endregion
嘿嘿,感觉挺方便的吧~~
这个只是个简单的使用,AutoMapper在实体转换方面做的还是挺成熟的,我们使用的时候,可以在此基础上再进一步封装。
时间: 2024-10-11 16:50:05