前言

最近还挺忙,还有点累,一直都没更新了,实在是懒呀。正题之前先说点别的,最近公司要扩张了,需要大量开发,领导说推荐有钱可以拿,如此好机会,我就趁机做个广告。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. ng-switch

    <p>ng-switch : </p> <div ng-switch="isShow"><!--isShow是boolean值--> ...

  2. elastichq auto connect

    $(document).ready(function () { $('#connectionURL').focus(); ajaxloading.hide(); scrollToTop.activat ...

  3. 网站访问量大 怎样优化mysql数据库

    MySQL优化的一些建议,单机MySQL的优化我分为三个部分,一是服务器物理硬件的优化,二是 MySQL安装时的编译优化,三是自身配置文件my.cnf的优化:如果单机的优化也解决不了你的数据库的压力的 ...

  4. Join Attributes

    1. IWorkspaceFactory2 workspaceFactory = new ShapefileWorkspaceFactoryClass() as IWorkspaceFactory2; ...

  5. MyBatis学习总结(一)——MyBatis快速入门

    一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...

  6. PHP数组

    PHP数组的遍历 使用for语句循环遍历数组 在PHP中,不仅可以指定非连续的数字索引值,而且还存在以字符串为下表的关联数组.所以在php中很少使用for语句循环来遍历数组.使用for语句遍历连续数字 ...

  7. iframe的自适应高度

    <iframe src="index.html" id="iframepage" name="iframepage" frameBor ...

  8. Linux C 文件输入输出函数 fopen()、getc()/fgetc()、putc()/fputc()、fclose()、fprintf()、fscanf()、fgets()、fputs()、fseek()、ftell()、fgetpos()、fsetpos() 详解

      fopen(打开文件) 定义函数 FILE * fopen(const char * path,const char * mode); 函数说明 参数path字符串包含欲打开的文件路径及文件名,参 ...

  9. Unix/Linux进程间通信(一):概述

    序 Linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的.而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进 ...

  10. DPM算法源程序voc-release5在Windows中的配置修改过程

    最近的<视频处理与分析>课程中有一个大作业,是有关DPM物体检测算法的.网上有DPM的源代码,但是原版只能在Linux或Mac上运行,而我的电脑是Windows系统,于是在网上搜了一下在怎 ...