c# AutoMapper踩坑
阿新 • • 發佈:2020-07-15
AutoMapper中的before和ForMember和after的區別
我這裡準備了一個測試用例,我們正常實體轉dto都是直接試用一些方法
CreateMap<TestEntity, TestDto>();
但是實際難免需要一些欄位型別的改變,這裡介紹before和ForMember還有after的區別
一、before的使用
before使用在實體轉化dto之前,用於改變實體的欄位值,然後再賦值給dto;
這裡的id本來是1,但是通過before轉化賦值後,輸出到都dto就變成了3;
二、after的使用
after使用在實體轉化dto之後,用於改變輸出dto的值,在實體賦值之後,到這裡型別如果沒問題的話,是不會報錯的,但是如果型別不對的話,就會報錯,
下面為大家演示一下
型別正確
型別錯誤:Introduce字串轉成陣列物件
這裡的字串轉成陣列物件,就會報型別錯誤,這也是我遇到的坑,這個時候before和after都不能用
三、ForMember的使用
這裡使用ForMember進行屬性條件轉換
屬性轉換成功了
public void Test1() { List<Detail> details = new List<Detail> { new Detail { Id=1, Name="唱" }, new Detail { Id=1, Name="跳" }, new Detail { Id=1, Name="rap" },new Detail { Id=1, Name="籃球" }, }; TestEntity test = new TestEntity { Id = 1, Name = "小明", Introduce = JsonConvert.SerializeObject(details) }; var config = new MapperConfiguration(cfg => { cfg.CreateMap<TestEntity, TestDto>(); // 表示源型別命名規則 cfg.SourceMemberNamingConvention = new PascalCaseNamingConvention(); //表示目標型別命名規則 cfg.DestinationMemberNamingConvention = new LowerUnderscoreNamingConvention(); //LowerUnderscoreNamingConvention 和 PascalCaseNamingConvention 是 AutoMapper 提供的兩個命名規則。前者命名是小寫幷包含下劃線,後者就是帕斯卡命名規則(每個單詞的首字母大寫)。 }); var result = config.CreateMapper().Map<TestDto>(test); } public class TestEntity { public int Id { get; set; } public string Name { get; set; } public string Introduce { get; set; } } public class TestDto { public int Id { get; set; } public string Name { get; set; } public List<Detail> Introduce { get; set; } } public class Detail { public int Id { get; set; } public string Name { get; set; } }