zoukankan      html  css  js  c++  java
  • 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; }
            }
  • 相关阅读:
    mysql批量导入删除
    sql查重去除id最小值
    Rest构建分布式 SpringCloud微服务架构项目
    Django模板语言及视图
    Django模板语言
    面向对象进阶
    初识面向对象
    os模块和sys模块
    random模
    时间模块
  • 原文地址:https://www.cnblogs.com/liguix/p/13307662.html
Copyright © 2011-2022 走看看