返回总目录


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(七)的更多相关文章

  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. PHP实现RTX发送消息提醒

    RTX是腾讯公司推出的企业级即时通信平台,大多数公司都在使用它,但是我们很多时候需要将自己系统或者产品的一些通知实时推送给RTX,这就需要用到RTX的服务端SDK,建议先去看看RTX的SDK开发文档( ...

  2. 来,给Entity Framework热热身

    先来看一下Entity Framework缓慢的初始化速度给我们更新程序带来的一种痛苦. 我们手动更新程序时通常的操作步骤如下: 1)把Web服务器从负载均衡中摘下来 2)更新程序 3)预热(发出一个 ...

  3. Sublime Text3配置在可交互环境下运行python快捷键

    安装插件 在Sublime Text3下面写代码感觉很不错,但是写Python的时候遇到了一些问题. 用Sublime Text3打开python文件,或者在Sublime Text3下写好pytho ...

  4. 23种设计模式--工厂模式-Factory Pattern

    一.工厂模式的介绍       工厂模式让我们相到的就是工厂,那么生活中的工厂是生产产品的,在代码中的工厂是生产实例的,在直白一点就是生产实例的类,代码中我们常用new关键字,那么这个new出来的实例 ...

  5. 将 instance 部署到 OVS Local Network - 每天5分钟玩转 OpenStack(130)

    上一节创建了 OVS 本地网络 first_local_net,今天我们会部署一个 instance 到该网络并分析网络结构.launch 一个 instance,选择 first_local_net ...

  6. JAVA程序员常用软件整理下载

    ********为了大家学习方便,特意整理软件下载如下:*************Java类软件:-------------------------------JDK7.0:http://pan.ba ...

  7. Visual Studio:error MSB8020(搬运)

    状况如下: error MSB8020: The builds tools for v120 (Platform Toolset = 'v120') cannot be found. To build ...

  8. Android Weekly Notes Issue #236

    Android Weekly Issue #236 December 18th, 2016 Android Weekly Issue #236 本期内容包括: Google的物联网平台Android ...

  9. Android6.0运行时权限管理

    自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifest设置就可以任意获取权限,而是更加的注重用户的隐私和体验,不会再强迫用户因拒绝不该拥有的权限而导致的无法安装 ...

  10. iOS9支付宝无法调起客户端

    1.为了适配 iOS9.0 中的 App Transport Security(ATS)对 http 的限制,这里需要对 支付宝的请求地址 alipay.com 做例外,在 app 对应的 info. ...