前言

最近还挺忙,还有点累,一直都没更新了,实在是懒呀。正题之前先说点别的,最近公司要扩张了,需要大量开发,领导说推荐有钱可以拿,如此好机会,我就趁机做个广告。ShippingRen.com招募.NET高级开发,坐标上海,有兴趣的给我留言,或者加我qq:1029183866,加的时候请说明博客园看到。

另外在说说这几天,工作忙是不可避免,业余也在准备自己的网站www.capqueen.com(目前还在备案中),准备用目前会的技术从无到有建立一个CMS(博客),到时候也会发一些文章和大家分享。最近还有一个想法,因为工作的关系用了很多框架和组件,大多数是github上的,我在考虑我研究过了之后稍微有些心得,是不是再搬运来和大家分享。目前在看的有FluentValidation和ServiceStack。

好了回归正题,这篇文章我会和大家分享关于AutoMapper的自定义转换规则。相信大家如果有在用的话,一定会遇到目标对象和源对象属性名字对应但是类型不对应,该如何解决呢?。

自定义类型转换规则(Custom type converters)

还是照样上场景,首先有以下两个类:

    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.AutoMapperMappingException: Missing type map configuration or unsupported mapping.//AutoMapper Mapping异常,找不到相应的类型配置或者不支持的Mapping

因此我们需要给Mapping指定相应的类型转换,AutoMapper提供了3种方式:

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

首先看第一种

Mapper.CreateMap<string, int>().ConvertUsing(System.Convert.ToInt32);

这种很简单,直接指定了一个方法,这里是使用了System.Convert里的默认转换,当然咱们也可以自定义只要是一个Func<TSource, TDestination>就可以了。

再来看剩下两种,这两种使用了接口ITypeConverter<in TSource, out TDestination>, 这个接口是AutoMapper提供的用于自定义的类型转换的实现。咱们看看实现,如下:

    public class DateTimeTypeConverter : ITypeConverter<string, DateTime>
{
public DateTime Convert(ResolutionContext context)
{
return System.Convert.ToDateTime(context.SourceValue);//使用了默认的Convert,这里注意这个context是上下文,附带了转换时的参数信息
}
} public class TypeTypeConverter : ITypeConverter<string, Type>
{
public Type Convert(ResolutionContext context)
{
return context.SourceType;//使用源属性的类型
}
}

然后再来看看使用方法:

    Mapper.CreateMap<string, DateTime>().ConvertUsing(new DateTimeTypeConverter());
Mapper.CreateMap<string, Type>().ConvertUsing<TypeTypeConverter>();

总结

自定义类型转换的好处在于,我们只要定义一次就可以在所有转换里都可以使用。但是我想,会不会存在一些情况,例如TypeA => TypeB 我们有多种转换需求?这样的场景,看起来AutoMapper无法采用自定义类型转换了。不知道有没有哪位知道如何处理的,请留言~

其实在我看来很多时候直接用自定义映射就已经可以解决掉了上面的问题,类型转换只是AutoMapper提供的一种遍历,感觉也说不上特别需要。

本篇文章搬运自:https://github.com/AutoMapper/AutoMapper/wiki/Custom-type-converters

下篇我会和大家分享关于自定义属性处理的文章,<AutoMapper搬运工之自定义属性计算>/另外我还在写一篇关于数据验证的文章,欢迎大家到时候来拍砖。

AutoMapper搬运工之自定义类型转换的更多相关文章

  1. AutoMapper搬运工之自定义映射

    回顾 上节说到了AutoMapper的简单使用,对于复杂的Mapping需要强大的自定义,这节我们来看下AutoMapper的自定义Mapping(Projection) 搬运自Git:https:/ ...

  2. AutoMapper搬运工之配置

    回顾 前几篇搬运了AutoMapper的基本用法,自定义映射,相信有看的同学已经会使用AutoMapper这个强大的Mapping工具了.不过细心的你是否还记得前几篇中有提到Map的创建并非是每次都需 ...

  3. 【.NET深呼吸】基础:自定义类型转换

    照例,老周在开始吹牛之前,先讲讲小故事,这是朋友提出的建议,老TMD写技术有什么了不起的,人人都会写.后来老周想想,也确实,代码谁不会写,能写到有品位有感悟,就不容易做到.于是,老周接受了该朋友的建议 ...

  4. 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换

    [源码下载] 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自 ...

  5. Struts2自定义类型转换,和处理类型转换错误

    Struts2自定义类型转换: 从前台接受到的类型全部是字符串,Struts2自带的一些基本类型转换有时不能满足我们的特别需要,如:日期字符串输入格式,还有一些自定义的类,直接传到后台,我们需要一些自 ...

  6. [Struts2学习笔记] -- 自定义类型转换

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  7. C#构造函数、操作符重载以及自定义类型转换

    构造器 构造器(构造函数)是将类型的实例初始化的特殊方法.构造器可分为实例构造器和类型构造器,本节将详细介绍有关内容. 实例构造器 顾名思义,实例构造器的作用就是对类型的实例进行初始化.如果类没有显示 ...

  8. java struts2入门学习---自定义类型转换

    自定义类型转换器的作用就是将struts无法识别的类型转换成自己所需要的. 比如输入:广东-东莞-虎门,对应的输出时能输出:广东省 东莞市 虎门(镇/区) 这里涉及到的知识点即是将String转换为任 ...

  9. mybatis generator 生成javabean自定义类型转换

    因为默认mybatis generator自动生成的,带小数的都转成了bigdecimal了,而且长度不同的整数转成了不同的类型. 但是我想要带小数的转成double,整数转成integer. 所有自 ...

随机推荐

  1. 【Codeforces715C&716E】Digit Tree 数学 + 点分治

    C. Digit Tree time limit per test:3 seconds memory limit per test:256 megabytes input:standard input ...

  2. BZOJ3505 [Cqoi2014]数三角形

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  3. js 时间戳转换成几分钟前,几小时前,几天前

    formatMsgTime (timespan) { var dateTime = new Date(timespan); var year = dateTime.getFullYear(); var ...

  4. Linux 下EXT2文件系统 —— 如何将蚂蚁和大象优雅的装进冰箱里

    这一阵子真是偷懒,无时无刻不和自己身体中的懒癌做斗争.最终我还是被打败了,星期天两天几乎都是荒废过去的,在空闲的时候实际上我内心也是有点焦虑的,不知道去怎么度过这时间.学习吧又不想学习,看电视娱乐吧也 ...

  5. ionic ios发布图标启动也不能正确加载问题

    前两天发布ios的时候发现ios安装的图标和启动页的时候不能正确显示,重新发布也不能正确显示,修改方法 在ionic build ios --release之前执行ionic resources即可

  6. Java的发展历程

    Java的发展历程充满了传奇色彩. 最初,Java是由Sun公司的一个研究小组开发出来的, 该小组起先的目标是想用软件实现对家用电器进行集成控制的小型控制装置. 开始,准备采用C++,但C++太复杂, ...

  7. SQL case

    case when Value='1' then 'True'  else 'False' end as 'Result'

  8. 11月7日上午PHP会话控制(session和cookie)、跨页面传值

    1.session  登录上一个页面以后,长时间没有操作,刷新页面以后需要重新登录. 特点:(1)session是存储在服务器:   (2)session每个人(登陆者)存一份: (3)session ...

  9. JS 原型的妙用

    原型是JS的一个重要的特征,通过它可以实现类和实例直接的继承关系. 1.原型来来实现数据备份 // 通过原型来来实现数据备份 function p(x){ this.x = x; } p.protot ...

  10. github上readme.md 格式

    参考:https://github.com/guoyunsky/Markdown-Chinese-Demo/edit/master/README.md