AutoMapper 创建嵌套对象映射(原创)
之前在做DTO转换时,用到AutoMapper。但DTO的层次太深了,无奈官方没针对嵌套类型提供好的解决方案,于是自己实现了一下:
思路:采用递归和反射很好的避免手工创建嵌套对象的映射。
第一个版本,已经提交到:https://github.com/AutoMapper/AutoMapper/wiki/Nested-mappings
/// <summary>
/// 递归创建类型间的映射关系 (Recursively create mappings between types)
///created by cqwang
/// </summary>
/// <param name="sourceType"></param>
/// <param name="destinationType"></param>
public static void CreateNestedMappers(Type sourceType, Type destinationType)
{
PropertyInfo[] sourceProperties = sourceType.GetProperties(BindingFlags.Public | BindingFlags.Instance);
PropertyInfo[] destinationProperties = destinationType.GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var destinationProperty in destinationProperties)
{
Type destinationPropertyType = destinationProperty.PropertyType;
if (Filter(destinationPropertyType))
continue; PropertyInfo sourceProperty = sourceProperties.FirstOrDefault(prop => NameMatches(prop.Name, destinationProperty.Name));
if (sourceProperty == null)
continue; Type sourcePropertyType=sourceProperty.PropertyType;
if (destinationPropertyType.IsGenericType)
{
Type destinationGenericType = destinationPropertyType.GetGenericArguments()[];
if (Filter(destinationGenericType))
continue; Type sourceGenericType = sourcePropertyType.GetGenericArguments()[];
CreateMappers(sourceGenericType, destinationGenericType);
}
else
{
CreateMappers(sourcePropertyType, destinationPropertyType);
}
} Mapper.CreateMap(sourceType, destinationType);
} /// <summary>
/// 过滤 (Filter)
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
static bool Filter(Type type)
{
return type.IsPrimitive || NoPrimitiveTypes.Contains(type.Name);
} static readonly HashSet<string> NoPrimitiveTypes = new HashSet<string>() { "String", "DateTime", "Decimal" }; private static bool NameMatches(string memberName, string nameToMatch)
{
return String.Compare(memberName, nameToMatch, StringComparison.OrdinalIgnoreCase) == ;
}
后来自测中发现,要过滤的一些结构体可能很多,比较麻烦,所以自己又完善了下,有了第二个版本

第二个版本在公司内的一些服务中已经使用并上线,挺好。因为并未涉及到公司内的任何业务信息,只是简单的思路和实现,所以这里贴出来给大家分享一下。
所有代码为原创,转载请注明出处。
其实,本没有路,走过去,便是路。
AutoMapper 创建嵌套对象映射(原创)的更多相关文章
- 基于 abp vNext 和 .NET Core 开发博客项目 - 用AutoMapper搞定对象映射
上一篇文章(https://www.cnblogs.com/meowv/p/12961014.html)集成了定时任务处理框架Hangfire,完成了一个简单的定时任务处理解决方案. 本篇紧接着来玩一 ...
- NetCore+AutoMapper多个对象映射到一个Dto对象
目录 一. 定义源映射类和被映射类DTO二.注入AutoMapper三.配置映射四.写测试 一.定义源映射对象 为了体现AutoMapper映射特性,在SocialAttribute中的Name属性没 ...
- C# AutoMapper:流行的对象映射框架,可减少大量硬编码,很小巧灵活,性能表现也可接受。
AutoMapper 是一个对象-对象映射器,可以将一个对象映射到另一个对象. 官网地址:http://automapper.org/ 官方文档:https://docs.automapper.org ...
- 关于对象映射(Dto->model) 思路的一些想法
最近粗浅的学习了下AutoMapper 这个做对象映射的第三方工具,觉得非常方便使用,所以简单的总结了一下我能想到的简单的对象映射的方式. 占时先不考虑源对象成员到目标对象成员的指定映射(即成员名不一 ...
- 对象映射 - Mapping.Mapster
前言 在项目中我们会经常遇到对象的映射,比如像Model和Dto之间的映射,或者是对象的深拷贝,这些都是需要我们自己实现的.此时,项目中会出现很多初始化对象的代码,这些代码写起来相当的枯燥乏味,那么有 ...
- 一文为你详细讲解对象映射库【AutoMapper】所支持场景
前言 在AutoMapper未出世前,对象与对象之间的映射,我们只能通过手动为每个属性一一赋值,时间长了不仅是我们而且老外也觉得映射代码很无聊啊.这个时候老外的所写的强大映射库AutoMapper横空 ...
- ASP.NET CORE 中使用AutoMapper进行对象映射
ASP.NET CORE 中使用AutoMapper进行对象映射 1.什么是AutoMapper? AutoMapper是基于对象到对象约定的映射工具,常用于(但并不仅限制于)把复杂的对象模型转为DT ...
- 对象映射工具AutoMapper介绍
AutoMapper是用来解决对象之间映射转换的类库.对于我们开发人员来说,写对象之间互相转换的代码是一件极其浪费生命的事情,AutoMapper能够帮助我们节省不少时间. 一. AutoMapper ...
- .NET之AutoMapper对象映射工具运用
AutoMapper对象映射工具:主要是将某一个实体转成另一个实体. 1.引用NuGet包;搜索:AutoMapper 2.创建实体类 using System; using System.Colle ...
随机推荐
- ServletContext加入和访问
(1)关于ServletContext认识: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGxnZW4xNTczODc=/font/5a6L5L2T/f ...
- ASP.NET 5 Beta8 发布
ASP.NET 5 Beta8 发布 ASP.NET 5 的路线图(详见 ASP.NET 5 Schedule and Roadmap : https://github.com/aspnet/home ...
- crontab演出newLISP脚本设置环境变量
今天遇到一个问题.执行在终端newLISP文字,一切正常,搬去crontab在将无法正常工作.即使crontab -e命令是在同一个用户执行.还是有问题. 因为newLISP脚本使用hive和hado ...
- android studio 在线更新android sdk,遇到无法Fetching https://dl-ssl.google.com/...的解决方式
近期实在受不了eclipse的"迟钝",准备入手Android studio开发环境,可是貌似不太顺利,安装成功了Android studio,在线更新Android adk的时候 ...
- 从头学起android<android基本的绘图.四十六.>
在一般的图形渲染用户通常只需要重写onDraw()该方法可以是.但是假设,才能真正完成绘图操作.此外,我们需要掌握的四大核心经营类: android.graphics.Bitmap:主要表示的是一个图 ...
- Android ADT Bundle(Eclipse with ADT) ADT R23
ADT Bundle Platform Package Size MD5 Checksum Windows 32-bit adt-bundle-windows-x86-20140624.zip 377 ...
- MD5算法的原理与实现
***********************************************声明************************************************ 原创 ...
- 背包问题 (DP)
利用记忆化数组.记dp[i][j]为根据rec的定义,从第i个物品开始挑选总重小于j时,总价值的最大值. 递推式: dp[i][j]=0 (j<w[i]) dp[i][j] dp[i][ ...
- Instruments-Automation: 通过命令行执行测试用例
为了实现该脚本的自己主动定时执行.我们需要开始在命令行和脚本,详细代码如下所示的: instruments -t /Applications/Xcode.app/Contents/Applicatio ...
- [Linux]使用Clang实现代码静态分析
1.按下开关Clang sudo apt-get install Clang 2.编写测试程序 memleak.c #include<stdio.h> #include<stdli ...