第一種:只引用AutoMapper包寫一個AutoMapperExtension的擴展方法
廢話不多說擴展方法代碼如下
1 /// <summary> 2 /// AutoMapper擴展 3 /// </summary> 4 public static class AutoMapperExtension 5 { 6 /// <summary> 7 /// 類型映射 8 /// </summary> 9 /// <typeparam name="TDestination">映射后的對象</typeparam> 10 /// <param name="obj">要映射的對象</param> 11 /// <returns></returns> 12 public static TDestination MapTo<TDestination>(this object obj) where TDestination : class 13 { 14 if (obj == null) return default(TDestination); 15 var config = new MapperConfiguration(cfg => cfg.CreateMap<TDestination, object>()); 16 var mapper = config.CreateMapper(); 17 return mapper.Map<TDestination>(obj); 18 } 19 20 /// <summary> 21 /// 集合列表類型映射 22 /// </summary> 23 /// <typeparam name="TDestination">目標對象類型</typeparam> 24 /// <param name="source">數據源</param> 25 /// <returns></returns> 26 public static List<TDestination> MapTo<TDestination>(this IEnumerable<TDestination> source) where TDestination : class 27 { 28 if (source == null) return default(List<TDestination>); 29 30 var config = new MapperConfiguration(cfg => cfg.CreateMap(source.GetType(), typeof(TDestination))); 31 var mapper = config.CreateMapper(); 32 return mapper.Map<List<TDestination>>(source); 33 } 34 35 /// <summary> 36 /// 集合列表類型映射 37 /// </summary> 38 /// <typeparam name="TSource">數據源類型</typeparam> 39 /// <typeparam name="TDestination">目標對象類型</typeparam> 40 /// <param name="source">數據源</param> 41 /// <returns></returns> 42 public static List<TDestination> MapTo<TSource, TDestination>(this IEnumerable<TSource> source) 43 where TDestination : class 44 where TSource : class 45 { 46 if (source == null) return new List<TDestination>(); 47 48 var config = new MapperConfiguration(cfg => cfg.CreateMap<TSource, TDestination>()); 49 var mapper = config.CreateMapper(); 50 return mapper.Map<List<TDestination>>(source); 51 } 52 53 /// <summary> 54 /// 集合列表類型映射 55 /// </summary> 56 /// <typeparam name="TSource">數據源類型</typeparam> 57 /// <typeparam name="TDestination">目標對象類型</typeparam> 58 /// <param name="source">數據源</param> 59 /// <param name="configure">自定義配置</param> 60 /// <returns></returns> 61 public static List<TDestination> MapTo<TSource, TDestination>(this IEnumerable<TSource> source, Action<IMapperConfigurationExpression> configure) 62 where TDestination : class 63 where TSource : class 64 { 65 if (source == null) return new List<TDestination>(); 66 67 var config = new MapperConfiguration(configure); 68 var mapper = config.CreateMapper(); 69 return mapper.Map<List<TDestination>>(source); 70 } 71 72 /// <summary> 73 /// 類型映射 74 /// </summary> 75 /// <typeparam name="TSource">數據源類型</typeparam> 76 /// <typeparam name="TDestination">目標對象類型</typeparam> 77 /// <param name="source">數據源</param> 78 /// <param name="destination">目標對象</param> 79 /// <returns></returns> 80 public static TDestination MapTo<TSource, TDestination>(this TSource source, TDestination destination) 81 where TSource : class 82 where TDestination : class 83 { 84 if (source == null) return destination; 85 86 var config = new MapperConfiguration(cfg => cfg.CreateMap<TSource, TDestination>()); 87 var mapper = config.CreateMapper(); 88 return mapper.Map<TSource, TDestination>(source, destination); 89 } 90 91 /// <summary> 92 /// 類型映射,默認字段名字一一對應 93 /// </summary> 94 /// <typeparam name="TDestination">轉化之后的model,可以理解為viewmodel</typeparam> 95 /// <typeparam name="TSource">要被轉化的實體,Entity</typeparam> 96 /// <param name="source">可以使用這個擴展方法的類型,任何引用類型</param> 97 /// <returns>轉化之后的實體</returns> 98 public static TDestination MapTo<TSource, TDestination>(this TSource source) 99 where TDestination : class 100 where TSource : class 101 { 102 if (source == null) return default(TDestination); 103 104 var config = new MapperConfiguration(cfg => cfg.CreateMap<TSource, TDestination>()); 105 var mapper = config.CreateMapper(); 106 return mapper.Map<TDestination>(source); 107 } 108 109 }
使用AutoMapper推薦這個AutoMapperExtension.MapTo<TSource, TDestination>(this TSource source);方法
class Program { static void Main(string[] args) { Student student = new Student { Id=5, Name="張三", Email="146855" }; StudentView model = AutoMapperExtension.MapTo<Student,StudentView>(student); bool b = model is null; Console.WriteLine(b); Console.ReadKey(); } } public class Student { public int Id { get; set; } public string Name { get; set; } public string Email { get; set; } } public class StudentView { public int Id { get; set; } public string Name { get; set; } public string Email { get; set; } public string ClassName { get; set; } }
結果如下student轉化studentView成功

第二種:寫一個配置類懶得寫直接參考下面的文章,麻煩一點
文章來自https://www.cnblogs.com/chenxi001/archive/2019/11/05/11800943.html
在我們的項目中慢慢的要把數據庫的實體模型和視圖模型進行分離,防止被人拿到我們表字段。在學校的時候自己只是有將很多數據庫模型,寫成一個視圖模型返回到前台。

首先我們把這兩個包引入項目中去。
然后我們創建一個轉換配置類,這個類要繼承 Profile 將我們需要轉換的類寫到我們構造函數里面去,這里要注意我們左邊的UserEntity是要將這個類型的數據轉換成UserModel
當然這個可以反過來,但是你轉換的關系一定要正確,左為要轉換的數據類型,右邊是轉換后的數據類型。(我已經幫你們測試了,關系不對亂轉報錯。)

在Startup 寫入注入這個配置

下面我們創建兩個類
這個是我們平常中數據庫表實體

這是我們的視圖模型

這個里要注意,在轉化的時候只有名字相同的字段才會成功附上對應的值。(大小寫可以不管,但是在項目中要做到一致,我上面沒有一致是測試一下。)
然后就是使用了
我們只要在使用的地方,注入進來了,就可以使用了。

這個是單個實體的轉換

簡寫方法,直接寫要轉成什么類型就可以了,但是轉換的配置類法不變。

當然我們還有集合的轉換了

