AutoMapper(三)
自定义类型转换
有时,需要完全控制一个类型到另一个类型的转换。一个类型一点都不像另一个类型,而且转换函数已经存在了,在这种情况下,你想要从一个“宽松”的类型转换成一个更强壮的类型,例如一个string的源类型到一个int32的目标类型。
这里有两个类Source和Destination,要把前者映射到后者,代码如下:
public class Source
{
public string Value1 { get; set; }
public string Value2 { get; set; }
public string Value3 { get; set; }
}
public class Destination
{
public int Value1 { get; set; }
public DateTime Value2 { get; set; }
public Type Value3 { get; set; }
}
截至发稿前,官方文档这样描述的“因为AutoMapper不清楚从string到int,Datetime或Type的映射,如果要尝试映射的话,AutoMapper就会抛出异常(在映射时和配置检查时)”。为了创建 这些类型的映射,我们必须提供自定义的类型转换器,我们有三种方法这样做:
void ConvertUsing(Func<TSource, TDestination> mappingFunction);
void ConvertUsing(ITypeConverter<TSource, TDestination> converter);
void ConvertUsing<TTypeConverter>() where TTypeConverter : ITypeConverter<TSource, TDestination>;
但是,我先不实现自定义的类型转换器试一下:
namespace ThirdAutoMapper
{
class Program
{
static void Main(string[] args)
{
Mapper.CreateMap<Source, Destination>();
var source = new Source
{
Value1 = "",
Value2 = "05/11/2015",
Value3 = "ThirdAutoMapper.Source"
}; var destination = Mapper.Map<Destination>(source);
Console.WriteLine("destination.Value1={0}", destination.Value1);
Console.WriteLine("destination.Value2={0}", destination.Value2);
Console.Read();
}
}
}
出现如下错误,但从错误看来,只有从string到Type类型映射时,出现了错误,其他两种类型呢?

现在我们将源类型和目标类型的第三个属性Value3注释掉,同时注释掉参与映射前的源类型对象的Value3属性,再来试一下。

果然,发现映射成功。也就说说最新版的AutoMapper默认可以将string类型映射为int和DateTime类型了。但是string还是没办法映射为Type类型。
对于以上AutoMapper的API给出的三种转换方法,第一个选择只是输入一个源返回一个目标的函数,这对于简单场合是有效的,但是对于更大的案例会变得难以处理。在更复杂的情况下,我们可以一个自定义的类型转换器,通过实现ITypeConverter<TSource, TDestination>接口创建:
第一种方法:
public class CustomTypeConverter : ITypeConverter<Source, Destination>
{ public Destination Convert(ResolutionContext context)
{
Source src = context.SourceValue as Source;
var dest = new Destination
{
Value1 = System.Convert.ToInt32(src.Value1),
Value2 = System.Convert.ToDateTime(src.Value2),
Value3 = context.SourceType
};
return dest;
}
}
然后给AutoMapper提供一个自定义类型的转换器或者AutoMapper在运行时能实例化的简化类型。对于上面的源/目标类型的映射配置就得以实现了:
修改Main方法中的代码为:
static void Main(string[] args)
{ Mapper.CreateMap<Source, Destination>().ConvertUsing<CustomTypeConverter>();
var source = new Source
{
Value1 = "",
Value2 = "05/11/2015",
Value3 = typeof(Source).ToString()
};
var destination = Mapper.Map<Destination>(source);
Console.WriteLine("destination.Value1={0}", destination.Value1);
Console.WriteLine("destination.Value2={0}", destination.Value2);
Console.WriteLine(destination.Value3.ToString()==source.Value3);
Console.WriteLine(destination.Value3);
Console.Read();
}
测试结果如下,映射成功!

第二种方法:
每个类型分别实现ITypeConverter接口:
public class DateTimeTypeConverter:ITypeConverter<string,DateTime>
{ public DateTime Convert(ResolutionContext context)
{
return System.Convert.ToDateTime(context.SourceValue);
}
} public class TypeTypeConverter : ITypeConverter<string, Type>
{ public Type Convert(ResolutionContext context)
{
return context.SourceValue == typeof(Source).ToString() ? typeof(Source) : typeof(Destination);
}
}
static void Main(string[] args)
{
//我看网上很多这种写法,包括官方文档,但是我这样写编译错误,可能是现在的AutoMapper不支持了吧
// Mapper.CreateMap<string, int>().ConvertUsing( Convert.ToInt32); Mapper.CreateMap<string, int>().ConvertUsing((context, intNum) => Convert.ToInt32(context.SourceValue));
Mapper.CreateMap<string, DateTime>().ConvertUsing(new DateTimeTypeConverter().Convert);
Mapper.CreateMap<string, Type>().ConvertUsing<TypeTypeConverter>(); Mapper.CreateMap<Source, Destination>();
//Mapper.CreateMap<Source, Destination>().ConvertUsing<CustomTypeConverter>();
var source = new Source
{
Value1 = "",
Value2 = "05/11/2015",
Value3 = typeof(Source).ToString()
}; var destination = Mapper.Map<Destination>(source);
Console.WriteLine("destination.Value1={0}", destination.Value1);
Console.WriteLine("destination.Value2={0}", destination.Value2);
Console.WriteLine(destination.Value3.ToString()==source.Value3);
Console.WriteLine(destination.Value3);
Console.Read();
}
测试结果,同样完美通过。

AutoMapper(三)的更多相关文章
- NetCore+AutoMapper多个对象映射到一个Dto对象
目录 一. 定义源映射类和被映射类DTO二.注入AutoMapper三.配置映射四.写测试 一.定义源映射对象 为了体现AutoMapper映射特性,在SocialAttribute中的Name属性没 ...
- ABP源码分析三十一:ABP.AutoMapper
这个模块封装了Automapper,使其更易于使用. 下图描述了改模块涉及的所有类之间的关系. AutoMapAttribute,AutoMapFromAttribute和AutoMapToAttri ...
- DTO学习系列之AutoMapper(三)
本篇目录: Custom Type Converters-自定义类型转换器 Custom Value Resolvers-自定义值解析器 Null Substitution-空值替换 Containe ...
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](三)
前言 上一篇<一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](二)>我们通过如下操作: 创建实体及工具类 创建Re ...
- 【AutoMapper官方文档】DTO与Domin Model相互转换(中)
写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...
- AutoMapper(二)
返回总目录 首先,先创建一个控制台项目,引用AutoMapper程序集,创建三个类User,UserDto,UserMappingProfile,下面的知识点的演示都以此项目为基础,代码分别如下: n ...
- 五步掌握OOM框架AutoMapper基本使用
本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文地址 www.cnblogs.com/tdws 写在前面 OOM顾名思义,Object-Object-Mapping实体间相互转换,Aut ...
- 使用Adminlite + ASP.NET MVC5(C#) + Entityframework + AutoFac + AutoMapper写了个api接口文档管理系统
一.演示: 接口查看:http://apidoc.docode.top/ 接口后台:http://apiadmin.docode.top/ 登录:administrator,123456 二.使用到的 ...
- AutoMapper使用手册(一)
阅读目录 1. 介绍 2. 基本使用 3. 自动分割映射(Flattening) 4. 自定义字段映射(Projection) 5. 验证配置(Configuration validation) 介绍 ...
随机推荐
- RabbitMq应用二
在应用一中,基本的消息队列使用已经完成了,在实际项目中,一定会出现各种各样的需求和问题,rabbitmq内置的很多强大机制和功能会帮助我们解决很多的问题,下面就一个一个的一起学习一下. 消息响应机制 ...
- UML课程复习重点
第一章 一.UML图示建模工具 二.UML--统一建模语言,以图形符号为基础,描述软件模型既简洁又清晰.它不是开发方法,是独立于任何开发方法之外的语言.它用于描述软件系统分析.设计和实施中的各种模型. ...
- premere cs4绿色版 安装 并且 视频导出 讲解
最近室友,开始在玩视频剪辑,用的是 premere cs4 绿色版.让他遇到的最大问题也是我之前遇到的最大问题,就是视频导出. 所以我在这里上传一套自己的一点点经验吧. 接下来,我就总结一下 我是怎么 ...
- JS判断鼠标进入容器方向的方法和分析window.open新窗口被拦截的问题
1.鼠标进入容器方向的判定 判断鼠标从哪个方向进入元素容器是一个经常碰到的问题,如何来判断呢?首先想到的是:获取鼠标的位置,然后经过一大堆的if..else逻辑来确定.这样的做法比较繁琐,下面介绍两种 ...
- javascript工厂模式和构造函数模式创建对象
一.工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程(本书后面还将讨论其他设计模式及其在JavaScript 中的实现).考虑到在ECMAScript 中无法创 ...
- ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存
ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存 part 1:给我点时间,允许我感慨一下2016年 正好有时间,总结一下最近使用的一些技术,也算是为2016年画上一个完 ...
- H3 BPM让天下没有难用的流程之技术特性
一.集成性 H3 BPM可以与其它系统进行多个层面的集成,满足企业的针对不同系统的集成需求. 图:多种集成维度 Ø 用户集成 可与企业现有系统进行组织架构同步或调用,也可以直接与AD 进行集成. ...
- 在禅道中实现WORD等OFFICE文档转换为PDF进行在线浏览
条件: 安装好禅道的服务器 能直接浏览PDF的浏览器(或通过 安装插件实现 ) 文档转换服务程序(建议部署在另一台服务器上) 实现 原理: 修改禅道的文件预览功能(OFFICE文档其使用的是下 ...
- Centos6.5 配置Nginx开机自启动
1.在/etc/init.d/目录下创建 nginx 文件,内容如下: #!/bin/sh # # nginx - this script starts and stops the nginx dae ...
- vim+vundle配置
Linux环境下写代码虽然没有IDE,但通过给vim配置几个插件也足够好用.一般常用的插件主要包括几类,查找文件,查找符号的定义或者声明(函数,变量等)以及自动补全功能.一般流程都是下载需要的工具,然 ...