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; }
            }
  • 相关阅读:
    前端安全【面试】
    防xss攻击
    前端工程化
    前端项目构建——运维
    react入门
    OpenGL Windows 窗口程序环境搭建
    Django 列的自定义显示
    设计模式之 SOA面向服务的体系
    设计模式之Builder建造者模式 代码初见
    设计模式之Factory工厂模式的好处
  • 原文地址:https://www.cnblogs.com/liguix/p/13307662.html
Copyright © 2011-2022 走看看