• 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; }
            }
  • 相关阅读:
    第三方网站实现绑定微信登陆
    安卓微信中bootstrap下拉菜单无法正常工作的解决方案
    一个Web钢琴谱记忆工具
    腾讯实习生面试经历-15年3月-Web前端岗
    AngularJS自定义指令三种scope
    AngularJS在自定义指令中传递Model
    Canvas文本绘制的浏览器差异
    AngularJS学习笔记
    善用width:auto以及white-space:nowrap以防止布局被打破
    Timeline中frame mode帧模式中idle占据大片位置
  • 原文地址:https://www.cnblogs.com/liguix/p/13307662.html
Copyright © 2020-2023  润新知