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,一经查实,立即删除!

相关文章

js正则归纳

/* * 正则的缓存区 * 一、 var numadb1122;var reg/(\d)\1(\d)\2/gi;console.log(num.match(reg));//[ 1122 ]二、普通字符&#xff1a;a b c 1 2 3 特殊字符&#xff1a;\d \w \D //w d 是什么三、元字符中限定符* &#xff1a; 匹配0到多 &#xff1a; 匹配1到…

洛谷 P1469 找筷子

题目描述 经过一段时间的紧张筹备&#xff0c;电脑小组的“RP餐厅”终于开业了&#xff0c;这天&#xff0c;经理LXC接到了一个定餐大单&#xff0c;可把大家乐坏了&#xff01;员工们齐心协力按要求准备好了套餐正准备派送时&#xff0c;突然碰到一个棘手的问题&#xff0c;筷…

玩转C#控件-常用控件属性

文章目录概述Control类的基本属性1、Name属性2、Text属性3、Anchor属性4、Dock属性Control类的方法和事件博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 概述 控件是包含在窗体上的对象&#xff0c;是构成用户界面的基本元素&#xff0c;也是…

LazyT 提供对延迟初始化的支持

延迟初始化 就是在第一次使用的时候在 进行类的初始化 public class Student{public Student(){this.Name "DefaultName";this.Age 0;Console.WriteLine("Student is init...");}public string Name { get; set; }public int Age { get; set; }} public…

264标准中高复杂度的三方面

一、运功估计搜索 二、码率控制 三、滤波算法 在264中&#xff0c;这三方面占据了绝大部分的计算复杂度。具体原因或是优化的具体步骤有时间补上。

ie浏览器不支持多行隐藏显示省略号

平时在写页面过程中&#xff0c;相信大家都遇到过文本显示多行后用省略号代替的问题&#xff0c;来看看代码&#xff1a; p{display: -webkit-box;overflow: hidden;text-overflow: ellipsis;-webkit-line-clamp:12;//表示显示12行之后用省略号代替-webkit-box-orient:vertical…

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的设计水准在业…

python带参装饰器的改良版

简单点就是这种 def deco2(param1):def _deco2(fun):def __deco2(*args, **kwargs):print (param)fun(*args, **kwargs)return __deco2return _deco2deco2 # 错误的写法 def f2(strx):print (strx)f2(hello) 运行上面这个&#xff0c;期待打印1和hello 实际上是不…

H.264边缘块进行帧内预测时,上边缘和左边缘块的预测情况。

仅仅介绍上边缘块需要用到上面的像素&#xff08;不存在&#xff09;&#xff08;例如垂直模式&#xff09;&#xff0c;左边缘快需要用到左边的像素&#xff08;不存在&#xff09;&#xff08;例如水平模式&#xff09;的情况。 H.264 I帧边缘块的处理 I帧的第一个左上的边缘…

P1021 邮票面值设计

P1021 邮票面值设计 题目描述 给定一个信封&#xff0c;最多只允许粘贴N张邮票&#xff0c;计算在给定K&#xff08;NK≤15&#xff09;种邮票的情况下&#xff08;假定所有的邮票数量都足够&#xff09;&#xff0c;如何设计邮票的面值&#xff0c;能得到最大值MAX&#xff0c…

第七章:XAML vs. code(3)

属性元素语法这里有一些C&#xff03;与第4章中的FramedText代码相似。在一个语句中&#xff0c;它实例化一个Frame和一个Label&#xff0c;并将Label设置为Frame的Content属性&#xff1a; new Frame {OutlineColor Color.Accent,HorizontalOptions LayoutOptions.Center,Ve…

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…

【实践】js实现随机不重复抽取数组中元素

经过3个星期的时间终于用做完了学校的练习作品了&#xff0c;但是发现在用jq 做互动虽然很方便但却带来了不少的烦恼 所以在以后的日子里我要好好学 js 了&#xff01; 然后呢在博主之前学java 里面 另我最头痛的就是做产生随机不重复的数据了 今天自己再巩固了一下以前的知识再…

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;区别何在&#…

【Oracle Database】数据库控制文件管理

移动控制文件 [oraclewallet01 ~]$ sqlplus / as sysdba SQL> set line 200 SQL> col name for a60 SQL> select status,name from v$controlfile;STATUS NAME ------- ------------------------------------------------------------/u01/app/oracle/oradata/wallet…

ADO接口简介

源地址&#xff1a;http://blog.csdn.net/xiaobai1593/article/details/7449151 参考&#xff1a; 1. 百度文库&#xff1a;http://wenku.baidu.com/view/8e2e99ecf8c75fbfc77db230.html 2. CSDN&#xff1a;http://blog.csdn.net/augusdi/article/details/7005597 接口概述&am…

jquery模拟可输入的下拉框

//页面html <div id"select" class"select" ><ul><c:forEach items"${movieCityList}" var"cy" varStatus"st"><li><a href"javascript:void(0)" onclick"selectOption($(this))…