/// <summary> /// AutoMapper擴展幫助類 /// </summary> public static class AutoMapperExtension { /// <summary> /// 類型映射 /// </summary> /// <typeparam name="TDestination">映射後的對象</typeparam> /// <param name="obj">要映射的對象</param> /// <returns></returns> public static TDestination MapTo<TDestination>(this object obj) where TDestination : class { if (obj == null) return default(TDestination); var config = new MapperConfiguration(cfg => cfg.CreateMap<TDestination, object>()); var mapper = config.CreateMapper(); return mapper.Map<TDestination>(obj); } /// <summary> /// 集合列表類型映射 /// </summary> /// <typeparam name="TDestination">目標對象類型</typeparam> /// <param name="source">數據源</param> /// <returns></returns> public static List<TDestination> MapTo<TDestination>(this IEnumerable source) where TDestination : class { if (source == null) return default(List<TDestination>); var config = new MapperConfiguration(cfg => cfg.CreateMap(source.GetType(), typeof(TDestination))); var mapper = config.CreateMapper(); return mapper.Map<List<TDestination>>(source); } /// <summary> /// 集合列表類型映射 /// </summary> /// <typeparam name="TSource">數據源類型</typeparam> /// <typeparam name="TDestination">目標對象類型</typeparam> /// <param name="source">數據源</param> /// <returns></returns> public static List<TDestination> MapTo<TSource, TDestination>(this IEnumerable<TSource> source) where TDestination : class where TSource : class { if (source == null) return new List<TDestination>(); var config = new MapperConfiguration(cfg => cfg.CreateMap<TSource, TDestination>()); var mapper = config.CreateMapper(); return mapper.Map<List<TDestination>>(source); } /// <summary> /// 集合列表類型映射 /// </summary> /// <typeparam name="TSource">數據源類型</typeparam> /// <typeparam name="TDestination">目標對象類型</typeparam> /// <param name="source">數據源</param> /// <param name="configure">自定義配置</param> /// <returns></returns> public static List<TDestination> MapTo<TSource, TDestination>(this IEnumerable<TSource> source, Action<IMapperConfiguration> configure) where TDestination : class where TSource : class { if (source == null) return new List<TDestination>(); var config = new MapperConfiguration(configure); var mapper = config.CreateMapper(); return mapper.Map<List<TDestination>>(source); } /// <summary> /// 類型映射 /// </summary> /// <typeparam name="TSource">數據源類型</typeparam> /// <typeparam name="TDestination">目標對象類型</typeparam> /// <param name="source">數據源</param> /// <param name="destination">目標對象</param> /// <returns></returns> public static TDestination MapTo<TSource, TDestination>(this TSource source, TDestination destination) where TSource : class where TDestination : class { if (source == null) return destination; var config = new MapperConfiguration(cfg => cfg.CreateMap<TSource, TDestination>()); var mapper = config.CreateMapper(); return mapper.Map<TSource, TDestination>(source, destination); } /// <summary> /// 類型映射,默認字段名字一一對應 /// </summary> /// <typeparam name="TDestination">轉化以後的model,能夠理解爲viewmodel</typeparam> /// <typeparam name="TSource">要被轉化的實體,Entity</typeparam> /// <param name="source">能夠使用這個擴展方法的類型,任何引用類型</param> /// <returns>轉化以後的實體</returns> public static TDestination MapTo<TSource, TDestination>(this TSource source) where TDestination : class where TSource : class { if (source == null) return default(TDestination); var config = new MapperConfiguration(cfg => cfg.CreateMap<TSource, TDestination>()); var mapper = config.CreateMapper(); return mapper.Map<TDestination>(source); } /// <summary> /// DataReader映射 /// </summary> /// <typeparam name="T">目標對象類型</typeparam> /// <param name="reader">數據源</param> /// <returns></returns> public static IEnumerable<T> MapTo<T>(this IDataReader reader) { var config = new MapperConfiguration(cfg => cfg.CreateMap<IDataReader, IEnumerable<T>>()); var mapper = config.CreateMapper(); return mapper.Map<IDataReader, IEnumerable<T>>(reader); } /// <summary> /// 將 DataTable 轉爲實體對象 /// </summary> /// <typeparam name="T">目標對象類型</typeparam> /// <param name="dt">數據源</param> /// <returns></returns> public static List<T> MapTo<T>(this DataTable dt) { if (dt == null || dt.Rows.Count == 0) return default(List<T>); var config = new MapperConfiguration(cfg => cfg.CreateMap<IDataReader, List<T>>()); var mapper = config.CreateMapper(); return mapper.Map<IDataReader, List<T>>(dt.CreateDataReader()); } /// <summary> /// 將List轉換爲Datatable /// </summary> /// <typeparam name="T">目標對象類型</typeparam> /// <param name="list">數據源</param> /// <returns></returns> public static DataTable MapTo<T>(this IEnumerable<T> list) { if (list == null) return default(DataTable); //建立屬性的集合 List<PropertyInfo> pList = new List<PropertyInfo>(); //得到反射的入口 System.Type type = typeof(T); DataTable dt = new DataTable(); //把全部的public屬性加入到集合 並添加DataTable的列 Array.ForEach<PropertyInfo>(type.GetProperties(), p => { pList.Add(p); dt.Columns.Add(p.Name, p.PropertyType); }); foreach (var item in list) { //建立一個DataRow實例 DataRow row = dt.NewRow(); //給row 賦值 pList.ForEach(p => row[p.Name] = p.GetValue(item, null)); //加入到DataTable dt.Rows.Add(row); } return dt; } }
調用方式:app
[TestMethod] private void MapToTest() { UserInfo userInfo = new UserInfo { PK = 1, UserId = "2018001", RealName = "大師兄", DepartmentId = "001", DepartmentName = "技術部", Sex = 1, UserOnLine = 1, CreateTime = DateTime.Now, Age = 10 }; IEnumerable<UserInfo> userInfos = new List<UserInfo> { new UserInfo { PK = 1, UserId = "2018001", RealName = "MrZhaoYi", DepartmentId = "001", DepartmentName = "技術部", Sex = 1, UserOnLine = 1, CreateTime = DateTime.Now }, new UserInfo { PK = 2, UserId = "2018002", RealName = "MrZhaoYi2", DepartmentId = "002", DepartmentName = "技術部", Sex = 1, UserOnLine = 1, CreateTime = DateTime.Now } }; DataTable dataTable = new DataTable("MyTable"); DataColumn column = new DataColumn("UserId", typeof(string)); dataTable.Columns.Add(column); DataRow dr = dataTable.NewRow(); dr["UserId"] = "003"; dataTable.Rows.Add(dr); UserInfoDTO dto1 = userInfo.MapTo<UserInfoDTO>(); UserInfoDTO dto2 = userInfo.MapTo<UserInfo, UserInfoDTO>(); List<UserInfoDTO> userInfoDtos1 = userInfos.MapTo<UserInfo, UserInfoDTO>(); List<UserInfoDTO> userInfoDtos2 = userInfos.MapTo<UserInfoDTO>(); List<UserInfoDTO> userInfoDtos3 = dataTable.MapTo<UserInfoDTO>(); //viewmodel與實體字段名字沒有所有對應,只有幾個字段的名字和源實體中的字段名字是同樣的,其餘的字段是經過實體中的幾個字段組合或者是格式或者是類型轉化而來的 //var config2 = new MapperConfiguration( // cfg => cfg.CreateMap<UserInfo, UserInfoDTO>() // .ForMember(d => d.UID, opt => opt.MapFrom(s => s.PK)) //指定字段一一對應 // .ForMember(d => d.AddTime, opt => opt.MapFrom(src => src.CreateTime.ToString("yy-MM-dd")))//指定字段,並轉化指定的格式 // .ForMember(d => d.Age, opt => opt.Condition(src => src.Age > 5))//條件賦值 // .ForMember(d => d.DepartmentName, opt => opt.Ignore())//忽略該字段,不給該字段賦值 // .ForMember(d => d.RealName, opt => opt.NullSubstitute("Default Value"))//若是源字段值爲空,則賦值爲 Default Value // .ForMember(d => d.Ex, opt => opt.MapFrom(src => src.PK + "_" + src.UserId + "_" + src.RealName)));//能夠本身隨意組合賦值 //var mapper2 = config2.CreateMapper(); //UserInfoDTO dto1 = mapper2.Map<UserInfoDTO>(userInfo); //Console.WriteLine(dto1.RealName); }
實體類:this
public class UserInfo { public int PK { get; set; } public int Age { get; set; } /// <summary> /// 用戶ID /// </summary> public string UserId { get; set; } /// <summary> /// 真實姓名 /// </summary> public string RealName { get; set; } /// <summary> /// 部門ID /// </summary> public string DepartmentId { get; set; } /// <summary> /// 部門名稱 /// </summary> public string DepartmentName { get; set; } /// <summary> /// 是否在線 1-在線 0-離線 /// </summary> public int UserOnLine { get; set; } public DateTime CreateTime { get; set; } public int Sex { get; set; } } public class UserInfoDTO { //public int UID { get; set; } //public int Age { get; set; } //public string Ex { get; set; } //public DateTime AddTime { get; set; } /// <summary> /// 用戶ID /// </summary> public string UserId { get; set; } /// <summary> /// 真實姓名 /// </summary> public string RealName { get; set; } /// <summary> /// 部門ID /// </summary> public string DepartmentId { get; set; } /// <summary> /// 部門名稱 /// </summary> public string DepartmentName { get; set; } /// <summary> /// 是否在線 1-在線 0-離線 /// </summary> public int UserOnLine { get; set; } }