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);