對象拷貝之AutoMapper簡單封裝

AutoMapper的集合轉換用起來有點彆扭,原因如下圖

簡單封裝一下,使使用體驗一致:(相同屬性才拷貝)

 

public class Mapper
    {
        /// <summary>
        /// 對象拷貝(屬性相同的字段拷貝,支持不同對象類型)
        /// </summary>
        /// <typeparam name="s"></typeparam>
        /// <typeparam name="d"></typeparam>
        /// <param name="src">源數據</param>
        /// <param name="dst">複製到的對象</param>
        public static void Map<s, d>(s src, ref d dst) 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>());
            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);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章