1. 程式人生 > 實用技巧 >c# AutoMapper踩坑

c# AutoMapper踩坑

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