对象拷贝之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);

 

posted @ 2023-05-25 15:57  Ace001  阅读(95)  评论(0)    收藏  举报