AutoMapper搬运工之自定义类型转换

前言

最近还挺忙,还有点累,一直都没更新了,实在是懒呀。正题之前先说点别的,最近公司要扩张了,需要大量开发,领导说推荐有钱可以拿,如此好机会,我就趁机做个广告。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搬运工之自定义属性计算>/另外我还在写一篇关于数据验证的文章,欢迎大家到时候来拍砖。

转载于:https://www.cnblogs.com/capqueen/p/AuoMaperCustomerTypeConvert.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460011.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XML基础

XML的英文全称是Extensible Markup Language&#xff0c;中文翻译为可扩展标记语言。它是网络应用开发的一项新技术。 与HTML一样&#xff0c;XML也是一种标记语言&#xff0c;但是XML的数据描述能力比HTML强&#xff0c;XML具有描述所有已知和未知数据的能力。XML扩展性比较好…

html使标签为正方形,W3C CSS测试答案

您的回答&#xff1a;1.CSS 指的是&#xff1f;您的回答&#xff1a;Cascading Style Sheets2.在以下的 HTML 中&#xff0c;哪个是正确引用外部样式表的方法&#xff1f;您的回答&#xff1a;3.在 HTML 文档中&#xff0c;引用外部样式表的正确位置是&#xff1f;您的回答&…

SqlBulkCopy 批量复制数据到数据表

使用 SqlBulkCopy 类只能向 SQL Server 表写入数据。但是&#xff0c;数据源不限于 SQL Server&#xff1b;可以使用任何数据源&#xff0c;只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据 使用Datatable作为数据源的方式&#xff1a;下面的代码使用到了Co…

OC-封装、继承、多态

面向对象的三大特征&#xff1a;封装、继承、多态 1.封装 什么是封装&#xff1a;在程序上&#xff0c;隐藏对象的属性和实现细节&#xff0c;仅对外公开接口&#xff0c;控制在程序中属性的读和修改的访问级别&#xff1b;将对象得到的数据和行为&#xff08;或功能&#xff0…

Android Ac 控件,Android控件--MultiAutoCompleteTextView

1.功能可支持选择多个值(在多次输入的情况下)&#xff0c;分别用分隔符分开&#xff0c;并且在每个选中的时候再次输入值时会自动匹配&#xff0c;可用在发短信、发邮件时选择联系人这种类型当中。2.独特属性android:completionThreshold"3" ----设置输入多少字符时自…

BZOJ1299 [LLH邀请赛]巧克力棒

怎么又是博弈论。。。我去 Orz hzwer&#xff0c;这道题其实是可以转化成Nim游戏的&#xff01; "第一步&#xff1a; 先从n根巧克力棒中取出m(m>0)根&#xff0c;使得这m根巧克力棒的xor和为0&#xff0c;同时使得剩下的n-m根巧克力棒无论怎么取&#xff0c;xor和都不…

android 安装应用程序apk安装不了

今天用测试机的时候遇到这个问题 解决办法&#xff1a; 在设置里面找到应用程序管理安全设置&#xff0c;&#xff0c;【允许未知来源程序安装】 -------------大致以上思路&#xff0c;具体按钮名称我就不重新去找了------------------

华为鸿蒙消费者,王成录谈鸿蒙挑战和华为消费者业务崛起

据 IDC 数据&#xff0c;全球智能手机出货量已连续 4 年下滑&#xff0c;在移动互联网之后&#xff0c;IoT 被认为是下一个更大量级的机会。在此背景下&#xff0c;鸿蒙是华为力图在 IoT 时代继续领先的关键项目&#xff0c;而面对贸易封锁&#xff0c;鸿蒙也成了华为冲出重围的…

读小米的《参与感》书的摘录(一),与大家分享!

1、互联网思维就是口碑为王 其实在过去选择产品&#xff0c;我们也一直会通过朋友或专家的口碑推荐来做决策&#xff0c;但不是主流。而今天口碑为王的背后&#xff0c;我理解我们面临的信息传播发生了一下三个重要的转变&#xff1a;1、信息从不对称转变为对称&#xff1b;2、…

Fragment的保存

2019独角兽企业重金招聘Python工程师标准>>> 一、场景 在一个fragment播放语音文件&#xff0c;一旦设备发生旋转&#xff0c;播放将暂停。因为fragment将重新生成。具体的流程步骤如下&#xff1a; 二、解决的方式 在Fragment的onCreate方法中&#xff0c;设置s…

html+监听+页面滚动到底部,解决HTML5中滚动到底部的事件问题

问题&#xff1a;在H5中&#xff0c;我们有这样的需求&#xff1a;例如有列表的时候&#xff0c;滚动到底部时&#xff0c;需要加载更多。解决方案&#xff1a;可以采用window的滚动事件进行处理分析&#xff1a;如果滚动是针对整个屏幕而言的(不针对于某个界面小块)&#xff0…

SQL Server 存储引擎-剖析Forwarded Records

我们都知道数据在存储引擎中是以页的形式组织的,但数据页在不同的组织形式中其中对应的数据行存储是不尽相同的,这里通过实例为大家介绍下堆表的中特有的一种情形Forwared Records及处理方式. 概念 堆表中,当对其中的记录进行更新时,如果当前数据页无法满足更新行的容量,此时这…

买面包和IoC

今天上午准备去一个阿姨&#xff0c;在那里买面包。这可能是由于小尺寸她的&#xff0c;因此&#xff0c;管理不规范&#xff0c;所以&#xff0c;当你买面包。没有人行。即使所有的大学生&#xff0c;似几乎没有这种意识。。。 但让我感到震惊的是。尽管没有排队&#xff0c;但…

u3d游戏开发视频潭州_游戏美术行业的发展与应用人工智能学院专业介绍及未来前景系列报告会二...

为了让2020级新同学对动漫专业加深认识&#xff0c;更好的规划学习&#xff0c;学院于11月12日6点晚邀请了校企合作单位“369云遮月游戏公司”在长安校区图书馆阶梯教室进行了游戏美术行业的发展与应用的报告会&#xff0c;主题围绕“专业介绍与发展前景”展开&#xff0c;云遮…

html文件怎么生产vm页面,如何使用spring mvc将Html文件转换为.vm(velocity模板)文件...

首先&#xff0c;您需要清楚的是&#xff0c;当您使用MVC时&#xff0c;您可以以任何您想要的方式提供页面。这是您的问题的一个可能的解决方案&#xff0c;这是我自己的应用程序的实际代码。您可能想要像这样提供* .html请求。的web.xmlappServletorg.springframework.web.ser…

统计元音

Problem Description 统计每个元音字母在字符串中出现的次数。 Input 输入数据首先包括一个整数n&#xff0c;表示测试实例的个数&#xff0c;然后是n行长度不超过100的字符串。 Output 对于每个测试实例输出5行&#xff0c;格式如下&#xff1a; a:num1 e:num2 i:num3 o:num4 …

华为谷歌互利合作曝光:或将推Nexus手表

业内传言称&#xff0c;中国的华为科技公司和韩国LG电子公司&#xff0c;今年将为谷歌公司设计两款Nexus品牌的智能手机&#xff0c;这也将是华为科技第一次参加谷歌的Nexus硬件计划。日前&#xff0c;国外权威媒体披露了华为Nexus硬件计划的更多内容。除了一款5.7英寸的智能手…

unity2d随机生成物体_2020 年最好用的一键生成设计神器,全在这里了!

对于很多新手设计师来说&#xff0c;要高效率地完成一件看上去还不错的设计作品&#xff0c;其实并不是一件容易的事。特别是在现实的工作中&#xff0c;对于临危受命的任务&#xff0c;更是很少有人会耐心地等你慢慢去摸索的.……不慌&#xff0c;今天就掏出一份私藏已久的设计…

android MPV架构快速实现,不是所有的MPV都叫GL8,一体化智能座舱体验来袭

进入车内&#xff0c;首先映入眼帘的就是双12.3吋全液晶仪表及中控联屏&#xff0c;出色的画面质感在第一时间吸引了我的注意。当然&#xff0c;全新的一体化智能座舱理念&#xff0c;多屏互联、多维交互也是它的最大亮点之一。全新一代别克GL8家族采用迭代更新的通讯解决方案&…

基于SuperSocket的IIS主动推送消息给android客户端

在上一篇文章《基于mina框架的GPS设备与服务器之间的交互》中&#xff0c;提到之前一直使用superwebsocket框架做为IIS和APP通信的媒介&#xff0c;经常出现无法通信的问题&#xff0c;必须一天几次的手动回收程序池&#xff0c;甚至重起服务器&#xff0c;通常周末接到一个陌生…