AutoMapper(五)

简介:

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 = 103;
            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);
复制代码

image

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

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

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





本文转自tkbSimplest博客园博客,原文链接:http://www.cnblogs.com/farb/p/4942805.html,如需转载请自行联系原作者

目录
相关文章
use of CGLib-based proxies by setting proxyTargetClass=true on @EnableAsync and/or @EnableCaching
use of CGLib-based proxies by setting proxyTargetClass=true on @EnableAsync and/or @EnableCaching
|
11月前
|
Oracle 关系型数据库 图形学
长三角文博会:Adobe国际认证体系推动设计人才评价新标准
2024年11月22日,第五届长三角文化博览会在上海开幕,成为展示区域文化产业发展的重要平台。ECA国际创意设计大赛聚焦“东方魅力”和“文化底蕴”,吸引全球目光。恒利联创作为支持单位,通过Adobe国际认证体系,助力设计人才的培养和发展,推动文化创意产业的繁荣。
|
JSON API 数据格式
.net core工具组件系列之Autofac—— 第一篇:Autofac系列Autofac的几种常见注册方式、生命周期和AOP
使用Autofac进行服务注册实践:新建三个项目,分别是webapi项目 Wesky.Core.Autofac以及两个类库项目 Wesky.Core.Interface和Wesky.Core.Service。在Webapi项目下,引用Autofac的三个包:Autofac、Autofac.Configuration和Autofac.Extensions.DependencyInjection 。
1839 1
.net core工具组件系列之Autofac—— 第一篇:Autofac系列Autofac的几种常见注册方式、生命周期和AOP
|
安全 网络协议 网络安全
【gRPC】来聊一聊gRPC的认证
【gRPC】来聊一聊gRPC的认证
259 0
|
消息中间件 运维 监控
阿里云丁宇:云原生激活应用构建新范式,Serverless奇点已来
阿里云丁宇:云原生激活应用构建新范式,Serverless奇点已来
887 10
阿里云丁宇:云原生激活应用构建新范式,Serverless奇点已来
|
Java
零基础学习Java语言——4、循环控制
零基础学习Java语言——4、循环控制
140 0
|
存储 分布式计算 安全
SaaS 模式云数据仓库 MaxCompute 安全最佳实践 | 学习笔记
快速学习 SaaS 模式云数据仓库 MaxCompute 安全最佳实践
260 0
SaaS  模式云数据仓库  MaxCompute  安全最佳实践 | 学习笔记
|
物联网 Linux 开发工具
CB6121蓝牙开发板试用-小白版
CB6121蓝牙开发板试用-小白版
CB6121蓝牙开发板试用-小白版
|
JSON JavaScript 数据格式
axios 设置请求头------vue
axios 设置请求头------vue