返回总目录


Null值替换

如果源类型的成员链上的属性值为Null,Null值替换允许提供一个可替换的值。下面有两个类Person和PersonInfo类,都有一个属性Title(头衔),从Person映射到PersonInfo,如果Person的属性没有赋值,那么PersonInfo的对应属性值就用“屌丝”来替换。

  1. namespace SeventhAutoMapper
  2. {
  3. class Person
  4. {
  5. public string Title { get; set; }
  6. }
  7.  
  8. class PersonInfo
  9. {
  10. public string Title { get; set; }
  11. }
  12. class Program
  13. {
  14. static void Main(string[] args)
  15. {
  16. //映射
  17. Mapper.CreateMap<Person, PersonInfo>()
  18. .ForMember(dest => dest.Title, opt => opt.NullSubstitute("屌丝"));//源属性如果为null,置为“屌丝”
  19. //执行映射
  20. var personInfo = Mapper.Map<PersonInfo>(new Person());//源属性未赋值,故为null
  21. var personInfo2 = Mapper.Map<PersonInfo>(new Person(){Title = "高富帅"});//源属性有值
  22. //输出结果
  23. Console.WriteLine("personInfo.Title=" + personInfo.Title);
  24. Console.WriteLine("personInfo2.Title=" + personInfo2.Title);
  25. Console.Read();
  26. }
  27. }
  28. }

测试结果如下:

开放泛型

AutoMapper支持开放泛型映射。下面创建两个泛型类:

  1. class Soure<T>
  2. {
  3. public T Value { get; set; }
  4. }
  5.  
  6. class Destination<T>
  7. {
  8. public T Value { get; set; }
  9. }

我们不需要创建封闭的泛型类型(也就是不将具体的类型写死在尖括号内),AutoMapper在运行时会将开放泛型的任何配置应用到关闭的映射上去。

  1. //创建开放泛型的映射
  2. Mapper.CreateMap(typeof(Source<>),typeof(Destination<>));
  3.  
  4. var src1 = new Source<int> {Value = 22};
  5. var dest1= Mapper.Map<Destination<int>>(src1);
  6. Console.WriteLine(dest1.Value);
  7.  
  8. var src2 = new Source<string> {Value = "Hello,AutoMapper!"};
  9. var dest2 = Mapper.Map<Destination<string>>(src2);
  10. Console.WriteLine(dest2.Value);
  11.  
  12. //......依次类推
  13. Console.Read();

测试结果如下:

因为C#只允许关闭的泛型形参,所以必须使用不带泛型参数的CreateMap方法来创建自己的开放泛型参数映射,同时可以使用所有可以利用的映射配置。AutoMapper在配置验证期间会跳过开放泛型类型映射。

也可以创建一个开放泛型转换器:

  1. Mapper.CreateMap(typeof(Source<>), typeof(Destination<>)).ConvertUsing(typeof(Converter<>));

投影

通过扁平化对象模型,将一个源类型转换成一个目标类型。不需要额外的配置,AutoMapper只要求一个扁平的目标类型能匹配源类型的命名结构。当把一个源值投影到一个不精准匹配源结构的目标值时,必须指明成员映射定义。

举个栗子,我们想把一个源结构CalendarEvent转成一个在Web页面上方便用户输入的目标结构CalendarEventForm:

  1. public class CalendarEvent
  2. {
  3. public DateTime Date { get; set; }
  4. public string Title { get; set; }
  5. }
  6.  
  7. public class CalendarEventForm
  8. {
  9. public DateTime EventDate { get; set; }
  10. public int EventHour { get; set; }
  11. public int EventMinute { get; set; }
  12. public string Title { get; set; }
  13. }

由于目标属性不是很匹配源属性(CalendarEvent.Date需要成为CalendarEventForm.EventDate),我们需要在类型映射配置中指明成员的映射规则:

  1. var calender = new CalendarEvent()
  2. {
  3. Date = DateTime.Now,
  4. Title = "历史性时刻"
  5. };
  6. //创建映射
  7. Mapper.CreateMap<CalendarEvent, CalendarEventForm>()
  8. .ForMember(dest => dest.EventDate, opt => opt.MapFrom(src => src.Date.Date))
  9. .ForMember(dest => dest.EventHour, opt => opt.MapFrom(src => src.Date.Hour))
  10. .ForMember(dest => dest.EventMinute, opt => opt.MapFrom(src => src.Date.Minute));
  11. //执行映射
  12. var calenderForm = Mapper.Map<CalendarEventForm>(calender);
  13. //输出映射前的对象
  14. Console.WriteLine("calender.Date={0},Title={1}",calender.Date,calender.Title);
  15. //输出映射后的对象
  16. foreach (PropertyInfo info in calenderForm.GetType().GetProperties())
  17. {
  18. Console.WriteLine(info.Name+"="+info.GetValue(calenderForm));
  19. }

测试结果如下:

好的,关于AutoMapper的系列教程就先告一段落了,当时开这系列教程的初衷是为了顺利地进行项目地开发,现在会用了,关于AutoMapper的话题就暂时先放放,不过以后肯定还会有关于AutoMapper的博客的。

AutoMapper(七)的更多相关文章

  1. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](七)

    前言 大家好,我依旧是你们的老朋友Rector,很高兴又在周五的时候准时和大家见面. Rector的系列文章[一步一步创建ASP.NET MVC5程序[Repository+Autofac+Autom ...

  2. DDD领域模型AutoMapper实现DTO(七)

    DTO的应用场景: 定义产品类: public class Product { public string ProductName { get; set; } public decimal Produ ...

  3. C#进阶系列——DDD领域驱动设计初探(五):AutoMapper使用

    前言:前篇搭建了下WCF的代码,就提到了DTO的概念,对于为什么要有这么一个DTO的对象,上章可能对于这点不太详尽,在此不厌其烦再来提提它的作用: 从安全上面考虑,领域Model都带有领域业务,让Cl ...

  4. C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建

    前言:好久没更新博客了,每天被该死的业务缠身,今天正好一个模块完成了,继续来完善我们的代码.之前的六篇完成了领域层.应用层.以及基础结构层的部分代码,这篇打算搭建下UI层的代码. DDD领域驱动设计初 ...

  5. AutoMapper用法一瞥

    前段时候做个小项目用到了autoMapper(参考了NOP里的用法),感觉还行,用起来挺方便的.首先复杂的东西我就不说了,至于详细的教程我也就不写了,比较园子里有很多这样的文章,我就分享下,在项目中实 ...

  6. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](八)

    前言 Hi, 大家好,还是星期五,还是Rector,又在图享网准时和大家见面了. 今天给大家带来系列教程<一步一步创建ASP.NET MVC5程序[Repository+Autofac+Auto ...

  7. 8分钟学会使用AutoMapper

    一.什么是AutoMapper与为什么用它. 它是一种对象与对象之间的映射器,让AutoMapper有意思的就是在于它提供了一些将类型A映射到类型B这种无聊的实例,只要B遵循AutoMapper已经建 ...

  8. c# AutoMapper 使用方式和再封装

    安装方式:使用vs自带的nuget管理工具,搜索AutoMapper ,选择第一个安装到你的项目即可. 我从网上找了一些资料, 参考网址:http://blog.csdn.net/csethcrm/a ...

  9. c# automapper 使用(一)

    一.最简单的用法 有两个类User和UserDto public class User { public int Id { get; set; } public string Name { get; ...

随机推荐

  1. C#异步编程(二)

    async和await结构 序 前篇博客异步编程系列(一) 已经介绍了何谓异步编程,这篇主要介绍怎么实现异步编程,主要通过C#5.0引入的async/await来实现. BeginInvoke和End ...

  2. 如何快速优化手游性能问题?从UGUI优化说起

    WeTest 导读   本文作者从自身多年的Unity项目UI开发及优化的经验出发,从UGUI,CPU,GPU以及unity特有资源等几个维度,介绍了unity手游性能优化的一些方法.   在之前的文 ...

  3. CSS 3学习——box-sizing和背景

    box-sizing 在CSS 2中设置元素的width和height仅仅是设置了元素内容区的宽和高,元素实际的尺寸是margin + border + padding + 内容区. CSS 3(截止 ...

  4. 【夯实Mysql基础】MySQL性能优化的21个最佳实践 和 mysql使用索引

    本文地址 分享提纲: 1.为查询缓存优化你的查询 2. EXPLAIN 你的 SELECT 查询 3. 当只要一行数据时使用 LIMIT 1 4. 为搜索字段建索引 5. 在Join表的时候使用相当类 ...

  5. H3 BPM让天下没有难用的流程之功能介绍

    H3 BPM10.0功能地图如下:  图:H3 BPM 功能地图 一.流程引擎 H3  BPM 流程引擎遵循WFMC 标准的工作流引擎技术,设计可运行的流程和表单,实现工作任务在人与人.人与系统.系统 ...

  6. Android中的flexboxlayout布局

    提到FlexboxLayout大家估计有点模糊,它是谷歌最近开源的一个android排版库,它的前身Flexbox是2009年W3C提出了一种新的布局,可以简便.完整.响应式的实现页面布局,Flexb ...

  7. 【python之路4】循环语句之while

    1.while 循环语句 #!/usr/bin/env python # -*- coding:utf-8 -*- import time bol = True while bol: print '1 ...

  8. 2DToolkit官方文档中文版打地鼠教程(一):初始设置

    这是2DToolkit官方文档中 Whack a Mole 打地鼠教程的译文,为了减少文中过多重复操作的翻译,以及一些无必要的句子,这里我假设你有Unity的基础知识(例如了解如何新建Sprite等) ...

  9. [转]Android Binder设计与实现 - 设计篇

    摘要 Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有管道,system V IPC,socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder ...

  10. ABP源码分析二十八:ABP.MemoryDB

    这个模块简单,且无实际作用.一般实际项目中都有用数据库做持久化,用了数据库就无法用这个MemoryDB 模块了.原因在于ABP限制了UnitOfWork的类型只能有一个(前文以作介绍),一般用了数据库 ...