返回总目录


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. SQLServer地址搜索性能优化例子

    这是一个很久以前的例子,现在在整理资料时无意发现,就拿出来再改写分享. 1.需求 1.1 基本需求: 根据输入的地址关键字,搜索出完整的地址路径,耗时要控制在几十毫秒内. 1.2 数据库地址表结构和数 ...

  2. [自翻]fasthttp中文文档(持续更新)

    fasthttp是由valyala编写的声称快于Go官方标准库net/http包十倍的快速HTTP实现.从各方的性能测试结果来看(评测一.评测二),fasthttp作为当下最快的http Go语言包当 ...

  3. pt-mext

    pt-mext实现的功能比较简单,就是将mysqladmin输出的多次迭代的相同status变量值放到同一行输出. 参数很少,除了--help和--version外,只有一个--relative参数 ...

  4. jquery屏幕滚动计算事件总结

    获取浏览器显示区域(可视区域)的高度 : $(window).height(); 获取浏览器显示区域(可视区域)的宽度 : $(window).width(); 获取页面的文档高度: $(docume ...

  5. SQL字符串函数

    LEN() :计算字符串长度(字符的个数.)datalength();//计算字符串所占用的字节数,不属于字符串函数.测试varchar变量与nvarchar变量存储字符串a的区别.见备注1.LOWE ...

  6. Ubuntu下开启php调试模式,显示报错信息

    在Ubuntu下php的缺省设置是不显示错误信息的,如果程序出错会显示“无法处理此请求的错误提示”,这在开发环境下非常不方便. 其实我们只要编辑下apache的配置文件就好 1.我的apache 配置 ...

  7. Tomcat之APR错误

    在发布Apache Tomcat的时候,突然出现如下错误: An incompatible version 1.1.31 of the APR based Apache Tomcat Native l ...

  8. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  9. mysql join 和left join 对于索引的问题

    今天遇到一个left join优化的问题,搞了一下午,中间查了不少资料,对MySQL的查询计划还有查询优化有了更进一步的了解,做一个简单的记录: select c.* from hotel_info_ ...

  10. ASP.NET Aries 3.0发布(附带通用API设计及基本教程介绍)

    主要更新: 1:升级处理机制(js请求由同步变更为异步) 2:优化前端JS:包括API和配置方式. 3:增加InputDialog功能. 4:增远远程验证功能. 5:优化权限安全机制. 6:增加一次请 ...