返回总目录


Dynamic和ExpandoObject映射

AutoMapper不用任何配置就可以从dynamic(动态)对象映射或映射到dynamic对象。

namespace FifthAutoMapper
{
//定义一个Person类
public class Person
{
public int Age { get; set; }
public string Name { get; set; }
}
//主程序
class Program
{
static void Main(string[] args)
{
//不需要CreateMap同样可以映射,这就是所谓的“零配置”
//Mapper.CreateMap<MyDynamicClass, Person>().ReverseMap(); //将一个动态对象映射到一个普通实例
dynamic dynamicObj = new ExpandoObject();//ExpandoObject对象包含可在运行时动态添加或移除的成员
dynamicObj.Age = ;
dynamicObj.Name = "tkb至简";
Person person = Mapper.Map<Person>(dynamicObj);
Console.WriteLine("person.Age={0},Name={1}", person.Age, person.Name); //将一个普通实例映射到动态对象
dynamic dynamicObj2= Mapper.Map<ExpandoObject>(person);
Console.WriteLine("dynamicObj2.Age={0},Name={1}", dynamicObj2.Age, dynamicObj2.Name);
Console.Read();
}
}
}

关于这个程序的说明,代码中都注释得很清楚了,不需再多做解释。

扁平化

对象与对象之间的映射的通常用法就是将一个复杂的模型压扁成一个更为简单的模型。为了演示需要,我这里定义几个类,代码如下:

namespace FifthAutoMapper
{
public class Order
{
public Customer Customer { get; set; } public decimal GetTotal()
{
return 100M;
}
} public class Customer
{
public string Name { get; set; }
} public class OrderDto
{
public string CustomerName { get; set; }
public decimal Total { get; set; }
} }

Order类:就是一个普通的订单类,当然,实际的项目肯定会有很多的属性,这里为了方便演示,只保留一个属性和一个方法。

Customer类:顾客类,定义了顾客的姓名。

OrderDto类:Order扁平化后的类,包含了特定需求的数据。

官方定义:当使用CreateMap方法在AutoMapper中配置源类型和目标类型时,配置器会尝试将源上的属性和方法匹配到目标的属性上。如果目标属性的任何属性在源类型的属性,方法或者以Get为前缀的方法都不存在,那么AutoMapper会把目标成员的名称(按照PascalCase惯例)分割成独立的单词。

下面测试一下,在Main方法中添加如下代码:

Mapper.CreateMap<Order, OrderDto>();
var order = new Order()
{
Customer = new Customer() {Name = "tkb至简"},
};
var orderDto= Mapper.Map<OrderDto>(order);
Console.WriteLine(orderDto.CustomerName);
Console.WriteLine(orderDto.Total);

虽然前面的博客已经说了很多了,但这里还是在啰嗦地解释一下。

我们在AutoMapper的Createmap方法中配置了类型映射。AutoMapper只能映射它知道的类型对,因此我们使用CreateMap显示地注册了源/目标类型对。为了执行映射,我们使用Map方法。

在OrderDto类中,Total属性匹配到了Order上的GetTotal方法。CustomerName属性匹配到了Order上的Customer.Name属性。总之,只要合适地命名目标类型属性,我们就不必配置单独的属性匹配。

AutoMapper(五)的更多相关文章

  1. 五步掌握OOM框架AutoMapper基本使用

    本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文地址 www.cnblogs.com/tdws  写在前面 OOM顾名思义,Object-Object-Mapping实体间相互转换,Aut ...

  2. C#进阶系列——DDD领域驱动设计初探(五):AutoMapper使用

    前言:前篇搭建了下WCF的代码,就提到了DTO的概念,对于为什么要有这么一个DTO的对象,上章可能对于这点不太详尽,在此不厌其烦再来提提它的作用: 从安全上面考虑,领域Model都带有领域业务,让Cl ...

  3. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](五)

    前言 Hi,大家好,我是Rector 时间飞逝,一个星期又过去了,今天还是星期五,Rector在图享网继续跟大家分享系列文本:一步一步创建ASP.NET MVC5程序[Repository+Autof ...

  4. DDD领域驱动设计初探(五):AutoMapper使用

    前言:前篇搭建了下WCF的代码,就提到了DTO的概念,对于为什么要有这么一个DTO的对象,上章可能对于这点不太详尽,在此不厌其烦再来提提它的作用: 从安全上面考虑,领域Model都带有领域业务,让Cl ...

  5. DTO学习系列之AutoMapper(五)----当EntityFramework爱上AutoMapper

    有时候相识即是一种缘分,相爱也不需要太多的理由,一个眼神足矣,当EntityFramework遇上AutoMapper,就是如此,恋爱虽易,相处不易. 在DDD(领域驱动设计)中,使用AutoMapp ...

  6. ASP.NET Core Web 应用程序系列(五)- 在ASP.NET Core中使用AutoMapper进行实体映射

    本章主要简单介绍下在ASP.NET Core中如何使用AutoMapper进行实体映射.在正式进入主题之前我们来看下几个概念: 1.数据库持久化对象PO(Persistent Object):顾名思义 ...

  7. Asp.net 面向接口可扩展框架之使用“类型转化基础服务”测试四种Mapper(AutoMapper、EmitMapper、NLiteMapper及TinyMapper)

    Asp.net 面向接口可扩展框架的“类型转化基础服务”是我认为除了“核心容器”之外最为重要的组成部分 但是前面博文一出,争议很多,为此我再写一篇类型转化基础服务和各种Mapper结合的例子,顺便对各 ...

  8. 使用AutoMapper实现Dto和Model的自由转换

    AutoMapper是一个.NET的对象映射工具. 项目地址:https://github.com/AutoMapper/AutoMapper. 帮助文档:https://github.com/Aut ...

  9. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](六)

    前言 大家好,我是Rector 又是星期五,很兴奋,很高兴,很high...啦啦啦... Rector在图享网又和大家见面啦!!!上一篇<一步一步创建ASP.NET MVC5程序[Reposit ...

随机推荐

  1. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 1.实施前准备工作 1.1 服务器安装操 ...

  2. .Net多线程编程—System.Threading.Tasks.Parallel

    System.Threading.Tasks.Parallel类提供了Parallel.Invoke,Parallel.For,Parallel.ForEach这三个静态方法. 1 Parallel. ...

  3. 学习ASP.NET Core,怎能不了解请求处理管道[2]: 服务器在管道中的“龙头”地位

    ASP.NET Core管道由注册的服务器和一系列中间件构成.我们在上一篇中深入剖析了中间件,现在我们来了解一下服务器.服务器是ASP .NET Core管道的第一个节点,它负责完整请求的监听和接收, ...

  4. VS2015墙内创建ionic2 【利用nrm更换源,完美!】

    STEP 1 设置cnpm npm install -g cnpm --registry=https://registry.npm.taobao.org   一句话建立cnpm STEP 2 安装nr ...

  5. Android studio使用git教程

    ①下载Git工具,配置到Android studio中 http://git-scm.com/downloads ------------------------------------------- ...

  6. 快速web开发中的前后端框架选型最佳实践

    这个最佳实践是我目前人在做的一个站点,主要功能: oauth登录 发布文章(我称为"片段"),片段可以自定义一些和内容有关的指标,如“文中人物:12”.支持自定义排版.插图.建立相 ...

  7. 布里斯班Twilight Bay Run半程马拉松

    自从8月3日跑了半马以后,又一鼓作气报了11月份的西昌马拉松.与第一次马拉松的只求完赛目标不同,第二次当然想取得一个更好的成绩.所以8月份练的比较猛,基本上是练2.3天休息一天,周么还要拉个长于21公 ...

  8. Leetcode 笔记 101 - Symmetric Tree

    题目链接:Symmetric Tree | LeetCode OJ Given a binary tree, check whether it is a mirror of itself (ie, s ...

  9. 从Java文件到字节码文件

    本文涉及的javac编译器来自openjdk. javac的目录地址为:解压目录/langtools/src/share/classes/com/sun/tools/javac/ javac编译器将J ...

  10. C# 委托Delegate(一) 基础介绍&用法

    本文是根据书本&网络 前人总结的. 1. 前言 定义&介绍: 委托Delegate是一个类,定义了方法的类型, 使得可以将方法当做另一个方法的参数来进行传递,这种将方法动态地赋给参数的 ...