对象拷贝之AutoMapper简单封装
AutoMapper的集合转换用起来有点别扭,原因如下图

简单封装一下,使使用体验一致:(相同属性才拷贝)
public class Mapper { public static D Map<S, D>(S src, List<string> ignoreProperties = null) where S : class where D : class { var config = new AutoMapper.MapperConfiguration(cfg => { var map = cfg.CreateMap<S, D>().ReverseMap(); // 如果有忽略字段,则配置忽略字段的映射 if (ignoreProperties != null && ignoreProperties.Any()) { foreach (var ignoreProperty in ignoreProperties) { map.ForMember(ignoreProperty, opt => opt.Ignore()); } } // 处理People.Hand.Thumb.Length这种嵌套类 }); var mapper = new AutoMapper.Mapper(config); return mapper.Map<D>(src); } /// <summary> /// 对象拷贝(属性相同的字段拷贝,支持不同对象类型) /// </summary> /// <typeparam name="S">源数据类型</typeparam> /// <typeparam name="D">目标数据类型</typeparam> /// <param name="src">源数据</param> /// <param name="dst">复制到的目标对象</param> /// <param name="ignoreProperties">复制到的目标对象</param> public static void Map<S, D>(S src, ref D dst, List<string> ignoreProperties = null) where S : class where D : class { var stype = src.GetType(); var isList = stype.IsGenericType && stype.GetGenericTypeDefinition() == typeof(List<>); var isArray = stype.IsArray; //var config = new AutoMapper.MapperConfiguration(cfg => cfg.CreateMap<S, D>()); // 默认的AutoMapper配置 var config = new AutoMapper.MapperConfiguration(cfg => { var map = cfg.CreateMap<S, D>().ReverseMap(); // 如果有忽略字段,则配置忽略字段的映射 if (ignoreProperties != null && ignoreProperties.Any()) { foreach (var ignoreProperty in ignoreProperties) { map.ForMember(ignoreProperty, opt => opt.Ignore()); } } // 处理嵌套类的映射 cfg.AddMaps(AppDomain.CurrentDomain.GetAssemblies()); }); if (isList) {//获得List<T>的元素T类型 config = GetCollectionConfig(stype.GetGenericArguments()[0], dst.GetType().GetGenericArguments()[0]); } if (isArray) {//获得T[]的元素T类型 config = GetCollectionConfig(stype.GetElementType(), dst.GetType().GetElementType()); } var mapper = new AutoMapper.Mapper(config); dst = mapper.Map<D>(src); } private static AutoMapper.MapperConfiguration GetCollectionConfig(Type schildType, Type dchildType) { var config = new AutoMapper.MapperConfiguration(cfg => cfg.CreateMap(schildType, dchildType)); return config; } }
使用:
1.单对象:
var dbM = db.First();
var dm=new NewModel(); //拷贝到的对象
Mapper.Map(dbM,ref dm);
2.List
var list =linqQueryDB().ToList();
var dlist = new List<NewModel>(); //拷贝到的对象
Mapper.Map(list,ref dlist);
3.Array
var sarr = list.ToArray();
var darr = new NewModel[0]; //拷贝到的对象
Mapper.Map(sarr, ref darr);
作者:xuejianxiyang
出处:http://xuejianxiyang.cnblogs.com
关于作者:Heaven helps those who help themselves.
本文版权归原作者和博客园共有,欢迎转载,但未经原作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号