c# automapper 使用

一、最简单的用法

有两个类User和UserDto

复制代码
 1     public class User2     {3         public int Id { get; set; }4         public string Name { get; set; }5         public int Age { get; set; }6     }7 8     public class UserDto9     {
10         public string Name { get; set; }
11         public int Age { get; set; }
12     }
复制代码

将User转换成UserDto也和简单

复制代码
1     Mapper.Initialize(x => x.CreateMap<User, UserDto>());
2     User user = new User()
3     {
4         Id = 1,
5         Name = "caoyc",
6         Age = 20
7     };
8     var dto = Mapper.Map<UserDto>(user);
复制代码

 这是一种最简单的使用,AutoMapper会更加字段名称去自动对于,忽略大小写。

 

二、如果属性名称不同

将UserDto的Name属性改成Name2

复制代码
 1     Mapper.Initialize(x => 2         x.CreateMap<User, UserDto>()3          .ForMember(d =>d.Name2, opt => {4             opt.MapFrom(s => s.Name);5             })6         );7 8     User user = new User()9     {
10         Id = 1,
11         Name = "caoyc",
12         Age = 20
13     };
14 
15     var dto = Mapper.Map<UserDto>(user);
复制代码

 

三、使用Profile配置

自定义一个UserProfile类继承Profile,并重写Configure方法

复制代码
 1     public class UserProfile : Profile2     {3         protected override void Configure()4         {5             CreateMap<User, UserDto>()6                 .ForMember(d => d.Name2, opt =>7                 {8                     opt.MapFrom(s => s.Name);9                 });
10         }
11     }
复制代码

使用时就这样

复制代码
 1     Mapper.Initialize(x => x.AddProfile<UserProfile>());2 3     User user = new User()4     {5         Id = 1,6         Name = "caoyc",7         Age = 208     };9 
10     var dto = Mapper.Map<UserDto>(user);
复制代码

 

四、空值替换NullSubstitute

空值替换允许我们将Source对象中的空值在转换为Destination的值的时候,使用指定的值来替换空值。

复制代码
 1     public class UserProfile : Profile2     {3         protected override void Configure()4         {5             CreateMap<User, UserDto>()6                 .ForMember(d => d.Name2, opt => opt.MapFrom(s => s.Name))7                 .ForMember(d => d.Name2, opt => opt.NullSubstitute("值为空"));8                 9         }
10     }
复制代码
复制代码
1     Mapper.Initialize(x => x.AddProfile<UserProfile>());
2 
3     User user = new User()
4     {
5         Id = 1,
6         Age = 20
7     };
8 
9     var dto = Mapper.Map<UserDto>(user);
复制代码

结果为:

 

五、忽略属性Ignore

复制代码
 1     public class User2     {3         public int Id { get; set; }4         public string Name { get; set; }5         public int Age { get; set; }6     }7 8     public class UserDto9     {
10         public string Name { get; set; }
11         public int Age { get; set; }
12 
13     }
14 
15     public class UserProfile : Profile
16     {
17         protected override void Configure()
18         {
19             CreateMap<User, UserDto>().ForMember("Name", opt => opt.Ignore());
20         }
21     }
复制代码

使用

复制代码
 1     Mapper.Initialize(x => x.AddProfile<UserProfile>());2 3     User user = new User()4     {5         Id = 1,6         Name="caoyc",7         Age = 208     };9 
10     var dto = Mapper.Map<UserDto>(user);
复制代码

结果:

 

六、预设值

如果目标属性多于源属性,可以进行预设值

复制代码
 1     public class User2     {3         public int Id { get; set; }4         public string Name { get; set; }5         public int Age { get; set; }6     }7 8     public class UserDto9     {
10         public string Name { get; set; }
11         public int Age { get; set; }
12         public string Gender { get; set; }
13 
14     }
15 
16     public class UserProfile : Profile
17     {
18         protected override void Configure()
19         {
20             CreateMap<User, UserDto>();
21         }
22     }
复制代码

使用

复制代码
 1     Mapper.Initialize(x => x.AddProfile<UserProfile>());2 3     User user = new User()4     {5         Id = 1,6         Name="caoyc",7         Age = 208     };9 
10     UserDto dto = new UserDto() {Gender = "男"};
11     Mapper.Map(user, dto);
复制代码

 七、类型转换ITypeConverter

如果数据中Gender存储的int类型,而DTO中Gender是String类型

复制代码
1     public class User
2     {
3         public int Gender { get; set; }
4     }
5 
6     public class UserDto
7     {
8         public string Gender { get; set; }
9     }
复制代码

类型转换类,需要实现接口ITypeConverter

复制代码
 1     public class GenderTypeConvertert : ITypeConverter<int, string>2     {3         public string Convert(int source, string destination, ResolutionContext context)4         {5             switch (source)6             {7                 case 0:8                     destination = "男";9                     break;
10                 case 1:
11                     destination = "女";
12                     break;
13                 default:
14                     destination = "未知";
15                     break;
16             }
17             return destination;
18         }
19     }
复制代码

配置规则

复制代码
 1     public class UserProfile : Profile2     {3         protected override void Configure()4         {5             CreateMap<User, UserDto>();6 7             CreateMap<int, string>().ConvertUsing<GenderTypeConvertert>();8             //也可以写这样9             //CreateMap<int, string>().ConvertUsing(new GenderTypeConvertert());
10         }
11     }
复制代码

使用

复制代码
 1     Mapper.Initialize(x => x.AddProfile<UserProfile>());2 3     User user0 = new User() { Gender = 0 };4     User user1 = new User() { Gender = 1 };5     User user2 = new User() { Gender = 2 };6     var dto0= Mapper.Map<UserDto>(user0);7     var dto1 = Mapper.Map<UserDto>(user1);8     var dto2 = Mapper.Map<UserDto>(user2);9 
10     Console.WriteLine("dto0:{0}", dto0.Gender);
11     Console.WriteLine("dto1:{0}", dto1.Gender);
12     Console.WriteLine("dto2:{0}", dto2.Gender);
复制代码

结果

 

八、条件约束Condition

当满足条件时才进行映射字段,例如人类年龄,假设我们现在人类年龄范围为0-200岁(这只是假设),只有满足在这个条件才进行映射

DTO和Entity

复制代码
1     public class User
2     {
3         public int Age { get; set; }
4     }
5 
6     public class UserDto
7     {
8         public int Age { get; set; }
9     }
复制代码

Profile

复制代码
1     public class UserProfile : Profile
2     {
3         protected override void Configure()
4         {
5             CreateMap<User, UserDto>().ForMember(dest=>dest.Age,opt=>opt.Condition(src=>src.Age>=0 && src.Age<=200));
6         }
7     }
复制代码

使用代码

复制代码
 1     Mapper.Initialize(x => x.AddProfile<UserProfile>());2 3     User user0 = new User() { Age = 1 };4     User user1 = new User() { Age = 150 };5     User user2 = new User() { Age = 201 };6     var dto0= Mapper.Map<UserDto>(user0);7     var dto1 = Mapper.Map<UserDto>(user1);8     var dto2 = Mapper.Map<UserDto>(user2);9 
10     Console.WriteLine("dto0:{0}", dto0.Age);
11     Console.WriteLine("dto1:{0}", dto1.Age);
12     Console.WriteLine("dto2:{0}", dto2.Age);
复制代码

输出结果

 

 

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
using AutoMapper;  
using System.Data;  namespace ConsoleApplication2  
{  class Program  {  static void Main(string[] args)  {  //1.普通转换  Name name1 = new Name() { FirstName = "L", LastName = "jz" };  Mapper.CreateMap<Name, NameDto>()  .BeforeMap((name, nameDto) => Console.WriteLine("hello world before"))  .AfterMap((name, nameDto) => Console.WriteLine("hello world after"));  NameDto nameDto1 = Mapper.Map<Name, NameDto>(name1);  Console.WriteLine("1");  Console.WriteLine(nameDto1.FirstName + nameDto1.LastName);  Console.WriteLine();  //Console.ReadKey();  //整体设置  //2.整体即时转换  
            Mapper.Reset();  Name name2 = new Name() { FirstName = "L", LastName = "jz" };  Mapper.CreateMap<Name, NameDto>()  .ConstructUsing(name => new NameDto() { AllName = name.FirstName + name.LastName });  NameDto nameDto2 = Mapper.Map<Name, NameDto>(name2);  Console.WriteLine("2");  Console.WriteLine(nameDto2.AllName);  Console.WriteLine();  //Console.ReadKey();  //3.整体通过TypeConverter类型转换  
            Mapper.Reset();  Name name3 = new Name() { FirstName = "L", LastName = "jz" };  Mapper.CreateMap<Name, NameDto>()  .ConvertUsing<NameConverter>();  NameDto nameDto3 = Mapper.Map<Name, NameDto>(name3);  Console.WriteLine("3");  Console.WriteLine(nameDto3.AllName);  Console.WriteLine();  //Console.ReadKey();  //单属性设置  //4.属性条件转换  
            Mapper.Reset();  Name name4 = new Name() { FirstName = "L", LastName = "jz" };  Mapper.CreateMap<Name, NameDto>()  .ForMember(name => name.FirstName, opt => opt.Condition(name => !name.FirstName.Equals("l", StringComparison.OrdinalIgnoreCase)));  NameDto nameDto4 = Mapper.Map<Name, NameDto>(name4);  Console.WriteLine("4");  Console.WriteLine(string.IsNullOrEmpty(nameDto4.FirstName));  Console.WriteLine();  //Console.ReadKey();  //5.属性忽略  
            Mapper.Reset();  Name name5 = new Name() { FirstName = "L", LastName = "jz" };  Mapper.CreateMap<Name, NameDto>()  .ForMember(name => name.FirstName, opt => opt.Ignore());  NameDto nameDto5 = Mapper.Map<Name, NameDto>(name5);  Console.WriteLine("5");  Console.WriteLine(string.IsNullOrEmpty(nameDto5.FirstName));  Console.WriteLine();  //Console.ReadKey();  //6.属性转换  
            Mapper.Reset();  Name name6 = new Name() { FirstName = "L", LastName = "jz" };  Mapper.CreateMap<Name, NameDto>()  .ForMember(name => name.AllName, opt => opt.MapFrom(name => name.FirstName + name.LastName))  .ForMember(name => name.FirstName, opt => opt.MapFrom(name=>name.FirstName));  NameDto nameDto6 = Mapper.Map<Name, NameDto>(name6);  Console.WriteLine("6");  Console.WriteLine(nameDto6.AllName);  Console.WriteLine();  //Console.ReadKey();  //7.属性通过ValueResolver转换  
            Mapper.Reset();  Name name7 = new Name() { FirstName = "L", LastName = "jz" };  Mapper.CreateMap<Name, StoreDto>()  .ForMember(storeDto => storeDto.Name, opt => opt.ResolveUsing<NameResolver>());  StoreDto store1 = Mapper.Map<Name, StoreDto>(name7);  Console.WriteLine("7");  Console.WriteLine(store1.Name.FirstName + store1.Name.LastName);  Console.WriteLine();  //Console.ReadKey();  //8.属性填充固定值  
            Mapper.Reset();  Name name8 = new Name() { FirstName = "L", LastName = "jz" };  Mapper.CreateMap<Name, NameDto>()  .ForMember(name => name.AllName, opt => opt.UseValue<string>("ljzforever"));  NameDto nameDto8 = Mapper.Map<Name, NameDto>(name8);  Console.WriteLine("8");  Console.WriteLine(nameDto8.AllName);  Console.WriteLine();  //Console.ReadKey();  //9.属性格式化  
            Mapper.Reset();  Name name9 = new Name() { FirstName = "L", LastName = "jz" };  Mapper.CreateMap<Name, NameDto>()  .ForMember(name => name.FirstName, opt => opt.AddFormatter<StringFormatter>());  NameDto nameDto9 = Mapper.Map<Name, NameDto>(name9);  Console.WriteLine("9");  Console.WriteLine(nameDto9.FirstName);  Console.WriteLine();  //Console.ReadKey();  //10.属性null时的默认值  
            Mapper.Reset();  Name name10 = new Name() { FirstName = "L" };  Mapper.CreateMap<Name, NameDto>()  .ForMember(name => name.LastName, opt => opt.NullSubstitute("jz"));  NameDto nameDto10 = Mapper.Map<Name, NameDto>(name10);  Console.WriteLine("10");  Console.WriteLine(nameDto10.LastName);  Console.WriteLine();  //Console.ReadKey();  //其它设置与特性  //11.转换匿名对象  
            Mapper.Reset();  object name11 = new { FirstName = "L", LastName = "jz" };  NameDto nameDto11 = Mapper.DynamicMap<NameDto>(name11);  Console.WriteLine("11");  Console.WriteLine(nameDto11.FirstName + nameDto11.LastName);  Console.WriteLine();  //Console.ReadKey();  //12.转换DataTable  
            Mapper.Reset();  DataTable dt = new DataTable();  dt.Columns.Add("FirstName", typeof(string));  dt.Columns.Add("LastName", typeof(string));  dt.Rows.Add("L", "jz");  List<NameDto> nameDto12 = Mapper.DynamicMap<IDataReader, List<NameDto>>(dt.CreateDataReader());  Console.WriteLine("12");  Console.WriteLine(nameDto12[0].FirstName + nameDto12[0].LastName);  Console.WriteLine();  //Console.ReadKey();  //emitMapper error  //List<NameDto> nameDto20 = EmitMapper.ObjectMapperManager.DefaultInstance.GetMapper<IDataReader, List<NameDto>>().Map(dt.CreateDataReader());  //13.转化存在的对象  
            Mapper.Reset();  Mapper.CreateMap<Name, NameDto>()  .ForMember(name => name.LastName, opt => opt.Ignore());  Name name13 = new Name() { FirstName = "L" };  NameDto nameDto13 = new NameDto() { LastName = "jz" };  Mapper.Map<Name, NameDto>(name13, nameDto13);  //nameDto13 = Mapper.Map<Name, NameDto>(name13);//注意,必需使用上面的写法,不然nameDto13对象的LastName属性会被覆盖  Console.WriteLine("13");  Console.WriteLine(nameDto13.FirstName + nameDto13.LastName);  Console.WriteLine();  //Console.ReadKey();  //14.Flatten特性 Store.Name.FirtName=FlattenName.NameFirstname  
            Mapper.Reset();  Mapper.CreateMap<Store, FlattenName>();  Store store2 = new Store() { Name = new Name() { FirstName = "L", LastName = "jz" } };  FlattenName nameDto14 = Mapper.Map<Store, FlattenName>(store2);  Console.WriteLine("14");  Console.WriteLine(nameDto14.NameFirstname + nameDto14.NameLastName);  Console.WriteLine();  //Console.ReadKey();  //15.将Dictionary转化为对象,现在还不支持  
            Mapper.Reset();  Mapper.CreateMap<Dictionary<string, object>, Name>();  Dictionary<string, object> dict = new Dictionary<string, object>();  dict.Add("FirstName", "L");  //Name name15 = Mapper.DynamicMap<Dictionary<string, object>, Name>(dict);  Name name15 = Mapper.Map<Dictionary<string, object>, Name>(dict);  Console.WriteLine("15");  Console.WriteLine(name15.FirstName);  Console.WriteLine();  Console.ReadKey();  }  }  public class Store  {  public Name Name { get; set; }  public int Age { get; set; }  }  public class Name  {  public string FirstName { get; set; }  public string LastName { get; set; }  }  public class StoreDto  {  public NameDto Name { get; set; }  public int Age { get; set; }  }  public class NameDto  {  public string FirstName { get; set; }  public string LastName { get; set; }  public string AllName { get; set; }  }  public class FlattenName  {  public string NameFirstname { get; set; }  public string NameLastName { get; set; }  }  public class NameConverter : TypeConverter<Name, NameDto>  {  protected override NameDto ConvertCore(Name source)  {  return new NameDto() { AllName = source.FirstName + source.LastName };  }  }  public class NameResolver : ValueResolver<Name, NameDto>  {  protected override NameDto ResolveCore(Name source)  {  return new NameDto() { FirstName = source.FirstName, LastName = source.LastName,AllName=source.FirstName+source.LastName };  }  }  public class NameFormatter : ValueFormatter<NameDto>  {  protected override string FormatValueCore(NameDto name)  {  return name.FirstName + name.LastName;  }  }  public class StringFormatter : ValueFormatter<string>  {  protected override string FormatValueCore(string name)  {  return name + "-";  }  }  
}  

 

转载于:https://www.cnblogs.com/vaevvaev/p/7080423.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

API设计原则 - Qt官网的设计实践总结

原文链接&#xff1a;API Design Principles - Qt Wiki 基于Gary的影响力上 Gary Gao 的译文稿&#xff1a;C的API设计指导 译文发在酷壳 - CoolShell&#xff1a;API设计原则&#xff0c; 2017-07-25 API设计原则 - Qt官网的设计实践总结 &#x1f34e; 译序 Qt的设计水准在业…

QtCreator5.12.6安装图文教程

前言接触过Qt的同学肯定用过QtCreator,本id最近常用&#xff0c;也就写个教程记录一下安装的过程。可能比较少人学过Qt&#xff0c;感觉Qt还是挺不错的&#xff0c;做出来的界面还算好看&#xff0c;关键是跨平台。说明&#xff1a;安装的系统&#xff1a;win10专业版QtCreator…

H.264学习(一)——帧和场的概念

一、何谓场&#xff1f; 每个电视帧都是通过扫描屏幕两次而产生的&#xff0c;第二个扫描的线条刚好填满第一次扫描所留下的缝隙。每个扫描即称为一个场。因此 25 帧/秒的电视画面实际上为 50 场/秒 (若为 NTSC 则分别为 30 & 60 - 因为我是中国人&#xff0c;因此我采用 P…

RabbitMQ for windows

一、搭建环境 Rabbit MQ 是建立在强大的Erlang OTP平台上&#xff0c;因此安装RabbitMQ之前要先安装Erlang。 erlang&#xff1a;http://www.erlang.org/download.html rabbitmq&#xff1a;http://www.rabbitmq.com/download.html 我目前使用的&#xff1a;http://pan.baidu.c…

圆环内外圆毛刺(凸起)缺口(凹陷)检测halcon

文章目录处理要求处理方法1方法一思路方法一halcon源码处理效果处理方法2方法二思路方法二halcon源码处理效果博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 处理要求 椭圆/圆环&#xff08;产品易变形&#xff0c;为椭圆&#xff09;内外圆…

什么是单播、多播和广播br

什么是单播、多播和广播   “单播”&#xff08;Unicast&#xff09;、“多播”&#xff08;Multicast&#xff09;和“广播”&#xff08;Broadcast&#xff09;这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究竟是什么意思&#xff1f;区别何在&#…

圆环同心度测量halcon

文章目录处理要求处理源码处理结果博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 处理要求 测量圆环同心度 处理源码 read_image (Image, C:/Users/22967/Desktop/图像Barrel 20201024/201024 手机行业 摄像头检测/Barrel 背光/Pic_2020_…

IP组播与组播协议

IP组播与组播协议 2008-4-27来源:不详 作者:佚名 点击&#xff1a;次在Internet上&#xff0c;多媒体业务诸如&#xff1a;流媒体&#xff0c;视频会议和视频点播等&#xff0c;正在成为信息传送的重要组成部分。点对点传输的单播方式不能适应这一类业务传输特性--单点发送多点…

Spring Cloud的应用程序—上下文服务

2019独角兽企业重金招聘Python工程师标准>>> Spring Boot对于如何使用Spring构建应用程序有一个看法&#xff1a;例如它具有常规配置文件的常规位置&#xff0c;以及用于常见管理和监视任务的端点。Spring Cloud建立在此之上&#xff0c;并添加了一些可能系统中所有…

halcon圆环完整度检测

文章目录处理要求程序源码处理结果博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 处理要求 查找好的圆环&#xff0c;检测圆环不良 程序源码 read_image (Image, F:/HALCON/圆环完整性检测/6.bmp) rgb1_to_gray (Image, GrayImage) v…

圆环划痕检测halcon

文章目录处理要求处理源码处理效果博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 处理要求 查找圆环缺陷 处理源码 read_image (Image, F:/HALCON/圆环划痕处理/10_33221_ba4582f0e88ec79.bmp) rgb3_to_gray (Image, Image, Image, Image…

日志OLAP:在SQL中使用UDF, lambda函数使用案例

场景 日志服务内置了20类SQL函数。面对用户复杂的业务场景&#xff0c;例如使用json来沉淀业务数据&#xff0c;普通的SQL函数可能就无法满足需求&#xff0c;需要一些用户自定义处理逻辑。为了处理json类的业务数据&#xff0c;我们可以采用把json展开成多行的形式进行统计分析…

瓶子个数计数halcon

文章目录处理要求处理方法一源码效果方法二源码效果博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 处理要求 查找纸箱内瓶子个数 处理方法一 源码 dev_clear_window () dev_open_window (0, 0, 640*1.5, 512*1.5, black, WindowHandle…

halcon自动对焦算法

1、介绍 图像清晰度是衡量图像质量的一个重要指标&#xff0c;对于相机来说&#xff0c;其一般工作在无参考图像的模式下&#xff0c;所以在拍照时需要进行对焦的控制。对焦不准确&#xff0c;图像就会变得比较模糊不清晰。相机对焦时通过一些清晰度评判指标&#xff0c;控制镜…

HTML学习笔记06-连接

HTML超链接 HTML使用标签<a>来设置文本超链接。 超链接可以是文字&#xff0c;也可以是图片&#xff0c;点击这些内容跳转到新的文档或当前文档的某个部分 代码类似这样&#xff1a; <a href"url">连接文本</a> 实例&#xff1a; <!DOCTYPE HTM…

在Xcode中使用Git进行源码版本控制

在Xcode中使用Git进行源码版本控制 在应用程序开发过程中&#xff0c;很重要的一部分工作就是如何进行源码的版本控制。当代码出现问题时&#xff0c;我们就需要将代码恢复到原先正常的版本。如果是多个人共同开发一个项目&#xff0c;那么代码的控制就会非常复杂。幸运的是&am…

ASP.NET Web API之消息[拦截]处理(转)

出处&#xff1a;http://www.cnblogs.com/Leo_wl/p/3238719.html 标题相当难取&#xff0c;内容也许和您想的不一样&#xff0c;而且网上已经有很多这方面的资料了&#xff0c;我不过是在实践过程中作下记录。废话少说&#xff0c;直接开始。 Exception 当服务端抛出未处理异常…

死磕算法之快速排序

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。博客源地址为zhixiang.org.cn https://blog.csdn.net/myFirstCN/article/details/80851021 学习更多算法系列请参考文章&#xff1a;死磕算法之汇总篇 快速排序是一个运用了分治法和递归算法的排序方…

Windows操作系统安全加固

本文档旨在指导系统管理人员或安全检查人员进行Windows操作系统的安全合规性检查和配置。 1. 账户管理和认证授权 1.1 账户 默认账户安全 禁用Guest账户。禁用或删除其他无用账户&#xff08;建议先禁用账户三个月&#xff0c;待确认没有问题后删除。&#xff09;操作步骤 打开…

TI DAVINCI开发原理(总共5部分)

2011-06-03 11:14:17| 分类&#xff1a; TI 达芬奇视频处 | 标签&#xff1a; |字号大中小订阅 DAVINCI开发原理之一----ARM端开发环境的建立(DVEVM) 1. 对DAVINCI平台&#xff0c;TI在硬件上给予双核架构强有力的支撑&#xff0c;在DSP端用DSP/BIOS来支持音视频算法的运行…