之前作过Object到Object的转换方法的封装,底层主要仍是靠反射取值赋值+循环来实现的。最近在公司里维护旧系统,这个系统使用了WCF,当时就很好奇他们的数据契约到实体模型的转换时怎么作的,以后查看源码,发现他们竟然是一个属性一个属性的赋值过来的,当时就给我雷到了,难道就没有人举得这个地方能够封装起来吗?app
据我目前了解,有三种方法能够实现这个实体类到实体类的转换过程,下面来简述下这三种方式。spa
第一种,也是最简单的一种,是用list自带的转换方法,可是这种方法须要本身定义转换规则,写起来也挺麻烦的,因此当时只作了个小Demo给你们看,也没有提倡使用;对象
第二种,就是用反射+泛型封装的方法,可是这种方法只能实现简单属性的转换,对于复杂对象的处理就会出现属性赋值方面的问题;blog
第三种方法,就是使用微软封装的AutoMapper。源码
接下来,本文主要简单介绍下AutoMapper的使用。string
首先找到“程序包管理器控制台”:it
而后输入:io
以后使用的时候,还有加入以下using:class
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在实体转换方面作的仍是挺成熟的,咱们使用的时候,能够在此基础上再进一步封装。