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