https://www.jianshu.com/p/47054d92db2a

自定义类型转换器(Custom Type Converters)

有时需要完全控制一种类型到另一种类型的转换。这一般发生在两种类型不同,已经存在转换函数,并且希望从弱类型转变为强类型,如源类型的字符串到目标类型Int32。

例如,假设我们的源类型为:

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 将抛出一个异常 (在执行映射时和配置检查时), 因为AutoMapper不知道从stringintDateTimeType的该如何映射。 要为这些类型创建映射,我们必须提供自定义类型转换器,我们有以下三种方法:

void ConvertUsing(Func<TSource, TDestination> mappingFunction);
void ConvertUsing(ITypeConverter<TSource, TDestination> converter);
void ConvertUsing<TTypeConverter>() where TTypeConverter : ITypeConverter<TSource, TDestination>;

第一种方法是写一个委托来指定如何转换源类型到目标类型。如

cfg.CreateMap<string,int>().ConvertUsing(s=>Convert.ToInt32(s));

这种方法只能处理简单类型的情况,针对复合类型的情况我们需要创建自定义的ITypeConverter<TSource, TDestination>转换器:

public interface ITypeConverter<in TSource, TDestination>
{
TDestination Convert(TSource source, TDestination destination, ResolutionContext context);
}

AutoMapper提供自定义类型转换器的实例,或者只提供类型,AutoMapper将在运行时实例化。然后,上面的源/目标类型的映射配置变为:

[Test]
public void Example()
{
Mapper.Initialize(cfg => {
cfg.CreateMap<string, int>().ConvertUsing(s => Convert.ToInt32(s));
cfg.CreateMap<string, DateTime>().ConvertUsing(new DateTimeTypeConverter());
cfg.CreateMap<string, Type>().ConvertUsing<TypeTypeConverter>();
cfg.CreateMap<Source, Destination>();
});
Mapper.AssertConfigurationIsValid(); var source = new Source
{
Value1 = "5",
Value2 = "01/01/2000",
Value3 = "AutoMapperSamples.GlobalTypeConverters.GlobalTypeConverters+Destination"
}; Destination result = Mapper.Map<Source, Destination>(source);
result.Value3.ShouldEqual(typeof(Destination));
} public class DateTimeTypeConverter : ITypeConverter<string, DateTime>
{
public DateTime Convert(string source, DateTime destination, ResolutionContext context)
{
return System.Convert.ToDateTime(source);
}
} public class TypeTypeConverter : ITypeConverter<string, Type>
{
public Type Convert(string source, Type destination, ResolutionContext context)
{
return Assembly.GetExecutingAssembly().GetType(source);
}
}

在第一个映射中,从string到Int32,我们只使用内置的Convert.ToInt32函数。
接下来的两个映射使用了自定义ITypeConverter实现。

自定义类型转换器的真正强大的地方在于,AutoMapper可以在任何源/目标类型上使用它们。我们可以在使用其他映射配置上方构建一组自定义类型转换器,而无需任何额外配置。在上面的例子中,我们永远不需要再次指定string/int 转换。如果必须在类型成员级别配置自定义值解析器,则自定义类型转换器的范围是全局的。

系统类型转换器

.NETFramework 通过TypeConverter类支持类型转换器的概念。AutoMapper 在配置检查和映射时支持这些类型的类型转换器,而且不需要手动配置。AutoMappe通过使用TypeDescriptor.GetConverter方法确定源/目标类型是否可映射。

09.AutoMapper 之自定义类型转换器(Custom Type Converters)的更多相关文章

  1. Struts2框架的自定义类型转换器

    前言:对于java的基本数据类型及一些系统类(如Date类.集合类),Struts2提供了内置类型转换功能,但是也有一定的限制.所以就演示出自定义类型转换器 一.应用于局部类型转换器 eg.用户登录出 ...

  2. Struts2之自定义类型转换器

    Struts2自定义类型转换器分为局部类型转换器和全局类型转换器 (1)局部类型转换器 如果页面传来一个参数reg.action?birthday=2010-11-12到后台action,然后属性用d ...

  3. Ⅵ.spring的点点滴滴--自定义类型转换器

    承接上文 自定义类型转换器 .net篇(环境为vs2012+Spring.Core.dll v1.31) public class CustomeConverter : TypeConverter{ ...

  4. Struts(二十):自定义类型转换器

    如何自定义类型转换器: 1)为什么需要自定义类型转化器?strtuts2不能自动完成字符串到所有的类型: 2) 如何定义类型转化器? 步骤一:创建自定义类型转化器的类,并继承org.apache.st ...

  5. 《SpringMVC从入门到放肆》十二、SpringMVC自定义类型转换器

    之前的教程,我们都已经学会了如何使用Spring MVC来进行开发,掌握了基本的开发方法,返回不同类型的结果也有了一定的了解,包括返回ModelAndView.返回List.Map等等,这里就包含了传 ...

  6. struts2基础---->自定义类型转换器

    这一章,我们开始struts2中自定义类型转换器的学习. 自定义类型转换器

  7. [JavaWeb基础] 013.Struts2 自定义类型转换器

    很多时候,我们在做web开发的时候经常要用到时间的转换器,Struts2给我们提供了一种类型转换器的接口.下面我们讲讲怎么实现吧. 1.首先我们要定义一个类型转换的类,继承自com.babybus.s ...

  8. sruts2 自定义类型转换器

    1.1.1    Struts2中自定义类型转换器:(了解) 类型转换的过程是双向的过程: JSP---->Action参数提交:String---Date. Action---->JSP ...

  9. [原创]java WEB学习笔记67:Struts2 学习之路-- 类型转换概述, 类型转换错误修改,如何自定义类型转换器

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. 高并发通信模型NIO

    一.NIO和BIO的对比 BIO通信模型 2.配置 BIO tomcat server.xml NIO 3.NIO

  2. sublime text3 最新 license注册码分享 2018

    —– BEGIN LICENSE —– Die Socialisten GmbH 10 User License EA7E-800613 51311422 E45F49ED 3F0ADE0C E5B8 ...

  3. Maven中的dependency的scope作用域

    1.test范围指的是测试范围有效,在编译和打包时都不会使用这个依赖 2.compile范围指的是编译范围有效,在编译和打包时都会将依赖存储进去 3.provided依赖:在编译和测试的过程有效,最后 ...

  4. SpringMVC详解一、@RequestMapping注解与Controller接收参数

    SpringMVC详解一.@RequestMapping注解与Controller接收参数 https://blog.csdn.net/mxcsdn/article/details/80719258 ...

  5. 【转载】Linux的五个查找命令

    原文:http://www.ruanyifeng.com/blog/2009/10/5_ways_to_search_for_files_using_the_terminal.html 最近,我在学习 ...

  6. Python学习笔记:第一次接触

    用的是windows的IDLE(python 3) 对象的认识:先创建一个list对象(用方括号) a = ['xieziyang','chenmanru'] a 对list中对象的引用 a[0] # ...

  7. leetcode-easy-others-118 Pascal's Triangle

    mycode   16.47% class Solution(object): def generate(self, numRows): """ :type numRow ...

  8. BeanDefinition 实例化过程

    BeanDefinition 实例化过程 AbstractBeanFactory#doGetBean AbstractBeanFactory# /** * 根据 bean 名称读取 bean * * ...

  9. Eureka入门一(了解概念)

    Eureka注册中心(8761端口) IDEA(开发工具) 1,创建项目勾选Eureka Server 2, 创建yml文件,拷贝配置,下面配置必须为false,意为,该项目不要作为客户端注册,因为本 ...

  10. Python解决数据样本类别分布不均衡问题

    所谓不平衡指的是:不同类别的样本数量差异非常大. 数据规模上可以分为大数据分布不均衡和小数据分布不均衡.大数据分布不均衡:例如拥有1000万条记录的数据集中,其中占比50万条的少数分类样本便于属于这种 ...