AutoMapper(七)
返回总目录
Null值替换
如果源类型的成员链上的属性值为Null,Null值替换允许提供一个可替换的值。下面有两个类Person和PersonInfo类,都有一个属性Title(头衔),从Person映射到PersonInfo,如果Person的属性没有赋值,那么PersonInfo的对应属性值就用“屌丝”来替换。
namespace SeventhAutoMapper
{
class Person
{
public string Title { get; set; }
} class PersonInfo
{
public string Title { get; set; }
}
class Program
{
static void Main(string[] args)
{
//映射
Mapper.CreateMap<Person, PersonInfo>()
.ForMember(dest => dest.Title, opt => opt.NullSubstitute("屌丝"));//源属性如果为null,置为“屌丝”
//执行映射
var personInfo = Mapper.Map<PersonInfo>(new Person());//源属性未赋值,故为null
var personInfo2 = Mapper.Map<PersonInfo>(new Person(){Title = "高富帅"});//源属性有值
//输出结果
Console.WriteLine("personInfo.Title=" + personInfo.Title);
Console.WriteLine("personInfo2.Title=" + personInfo2.Title);
Console.Read();
}
}
}
测试结果如下:

开放泛型
AutoMapper支持开放泛型映射。下面创建两个泛型类:
class Soure<T>
{
public T Value { get; set; }
} class Destination<T>
{
public T Value { get; set; }
}
我们不需要创建封闭的泛型类型(也就是不将具体的类型写死在尖括号内),AutoMapper在运行时会将开放泛型的任何配置应用到关闭的映射上去。
//创建开放泛型的映射
Mapper.CreateMap(typeof(Source<>),typeof(Destination<>)); var src1 = new Source<int> {Value = 22};
var dest1= Mapper.Map<Destination<int>>(src1);
Console.WriteLine(dest1.Value); var src2 = new Source<string> {Value = "Hello,AutoMapper!"};
var dest2 = Mapper.Map<Destination<string>>(src2);
Console.WriteLine(dest2.Value); //......依次类推
Console.Read();
测试结果如下:

因为C#只允许关闭的泛型形参,所以必须使用不带泛型参数的CreateMap方法来创建自己的开放泛型参数映射,同时可以使用所有可以利用的映射配置。AutoMapper在配置验证期间会跳过开放泛型类型映射。
也可以创建一个开放泛型转换器:
Mapper.CreateMap(typeof(Source<>), typeof(Destination<>)).ConvertUsing(typeof(Converter<>));
投影
通过扁平化对象模型,将一个源类型转换成一个目标类型。不需要额外的配置,AutoMapper只要求一个扁平的目标类型能匹配源类型的命名结构。当把一个源值投影到一个不精准匹配源结构的目标值时,必须指明成员映射定义。
举个栗子,我们想把一个源结构CalendarEvent转成一个在Web页面上方便用户输入的目标结构CalendarEventForm:
public class CalendarEvent
{
public DateTime Date { get; set; }
public string Title { get; set; }
} public class CalendarEventForm
{
public DateTime EventDate { get; set; }
public int EventHour { get; set; }
public int EventMinute { get; set; }
public string Title { get; set; }
}
由于目标属性不是很匹配源属性(CalendarEvent.Date需要成为CalendarEventForm.EventDate),我们需要在类型映射配置中指明成员的映射规则:
var calender = new CalendarEvent()
{
Date = DateTime.Now,
Title = "历史性时刻"
};
//创建映射
Mapper.CreateMap<CalendarEvent, CalendarEventForm>()
.ForMember(dest => dest.EventDate, opt => opt.MapFrom(src => src.Date.Date))
.ForMember(dest => dest.EventHour, opt => opt.MapFrom(src => src.Date.Hour))
.ForMember(dest => dest.EventMinute, opt => opt.MapFrom(src => src.Date.Minute));
//执行映射
var calenderForm = Mapper.Map<CalendarEventForm>(calender);
//输出映射前的对象
Console.WriteLine("calender.Date={0},Title={1}",calender.Date,calender.Title);
//输出映射后的对象
foreach (PropertyInfo info in calenderForm.GetType().GetProperties())
{
Console.WriteLine(info.Name+"="+info.GetValue(calenderForm));
}
测试结果如下:

好的,关于AutoMapper的系列教程就先告一段落了,当时开这系列教程的初衷是为了顺利地进行项目地开发,现在会用了,关于AutoMapper的话题就暂时先放放,不过以后肯定还会有关于AutoMapper的博客的。
AutoMapper(七)的更多相关文章
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](七)
前言 大家好,我依旧是你们的老朋友Rector,很高兴又在周五的时候准时和大家见面. Rector的系列文章[一步一步创建ASP.NET MVC5程序[Repository+Autofac+Autom ...
- DDD领域模型AutoMapper实现DTO(七)
DTO的应用场景: 定义产品类: public class Product { public string ProductName { get; set; } public decimal Produ ...
- C#进阶系列——DDD领域驱动设计初探(五):AutoMapper使用
前言:前篇搭建了下WCF的代码,就提到了DTO的概念,对于为什么要有这么一个DTO的对象,上章可能对于这点不太详尽,在此不厌其烦再来提提它的作用: 从安全上面考虑,领域Model都带有领域业务,让Cl ...
- C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建
前言:好久没更新博客了,每天被该死的业务缠身,今天正好一个模块完成了,继续来完善我们的代码.之前的六篇完成了领域层.应用层.以及基础结构层的部分代码,这篇打算搭建下UI层的代码. DDD领域驱动设计初 ...
- AutoMapper用法一瞥
前段时候做个小项目用到了autoMapper(参考了NOP里的用法),感觉还行,用起来挺方便的.首先复杂的东西我就不说了,至于详细的教程我也就不写了,比较园子里有很多这样的文章,我就分享下,在项目中实 ...
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](八)
前言 Hi, 大家好,还是星期五,还是Rector,又在图享网准时和大家见面了. 今天给大家带来系列教程<一步一步创建ASP.NET MVC5程序[Repository+Autofac+Auto ...
- 8分钟学会使用AutoMapper
一.什么是AutoMapper与为什么用它. 它是一种对象与对象之间的映射器,让AutoMapper有意思的就是在于它提供了一些将类型A映射到类型B这种无聊的实例,只要B遵循AutoMapper已经建 ...
- c# AutoMapper 使用方式和再封装
安装方式:使用vs自带的nuget管理工具,搜索AutoMapper ,选择第一个安装到你的项目即可. 我从网上找了一些资料, 参考网址:http://blog.csdn.net/csethcrm/a ...
- c# automapper 使用(一)
一.最简单的用法 有两个类User和UserDto public class User { public int Id { get; set; } public string Name { get; ...
随机推荐
- Jquery的事件操作和文档操作
对于熟悉前端开发的小伙伴,相信对于Jquery一定不陌生,相对于JavaScript的繁琐,Jquery更加的简洁,当然简洁不意味着简单,我们可以使用Jquery完成我们想要实现全部功能,这里为小白们 ...
- [C#] C# 知识回顾 - 异常介绍
异常介绍 我们平时在写程序时,无意中(或技术不够),而导致程序运行时出现意外(或异常),对于这个问题, C# 有专门的异常处理程序. 异常处理所涉及到的关键字有 try.catch 和 finally ...
- js参数arguments的理解
原文地址:js参数arguments的理解 对于函数的参数而言,如下例子 function say(name, msg){ alert(name + 'say' + msg); } say('xiao ...
- Lind.DDD.LindAspects方法拦截的介绍
回到目录 什么是LindAspects 之前写了关于Aspects的文章<Lind.DDD.Aspects通过Plugins实现方法的动态拦截~Lind里的AOP>,今天主要在设计思想上进 ...
- Nginx学习笔记--001-Nginx快速搭建
Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由Igor Sysoev为俄罗斯访问量第二的R ...
- JavaScript学习笔记(三)——this、原型、javascript面向对象
一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...
- 为什么很多SaaS企业级产品都熬不过第一年
因工作缘由,笔者与周边数位SaaS企业级应用的创始人.运营负责人有过深入接触,发现一个有趣的现象:刚起步时,蓝图远志.规划清晰,但是一路下来,却异常艰难,有些甚至熬不过第一年,就关门歇业. 2015年 ...
- Android中Fragment和ViewPager那点事儿(仿微信APP)
在之前的博文<Android中使用ViewPager实现屏幕页面切换和引导页效果实现>和<Android中Fragment的两种创建方式>以及<Android中Fragm ...
- emmet,jade,haml, slim,less,sass,coffeescript等的实战优缺点
摘要: 文章背景,来自于群内周五晚上的一次头脑风暴式的思维碰撞交流活动. 随着前端技术的蓬勃发展, 各种新技术随着生产力的需要不断的涌入我们的视野, 那今天探讨的话题是这些新时代的前端兵器谱: 一. ...
- XSS 前端防火墙 —— 天衣无缝的防护
上一篇讲解了钩子程序的攻防实战,并实现了一套对框架页的监控方案,将防护作用到所有子页面. 到目前为止,我们防护的深度已经差不多,但广度还有所欠缺. 例如,我们的属性钩子只考虑了 setAttribut ...