当前位置:威尼斯 > jave > 类型转化基础服务,集合映射到表(这个功能A

类型转化基础服务,集合映射到表(这个功能A

文章作者:jave 上传时间:2019-11-08

AutoMapper能够很有利的将叁个实体的属性值转变给另一个目的。那一个效应在我们经常看到的编码中时时会遇上。小编将AutoMapper的黄金年代对中央映射作用做成扩大方法,在编码中更方便使用。

Asp.net 面向接口可扩充框架的“类型转变基本功服务”是本身感觉除了“大旨容器”之外最为关键的组成都部队分

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AutoMapper;
using System.Collections;
using System.Data;
using System.Reflection;

namespace NFMES.Core.Type
{
    public static class AutoMapperExtension
    {
        /// <summary>
        /// 实体对象转换
        /// </summary>
        /// <typeparam name="TDestination"></typeparam>
        /// <param name="o"></param>
        /// <returns></returns>
        public static TDestination MapTo<TDestination>(this object o)
        {
            if (o == null)
                throw new ArgumentNullException();

            Mapper.CreateMap(o.GetType(), typeof(TDestination));

            return Mapper.Map<TDestination>(o); ;
        }

        /// <summary>
        /// 集合转换
        /// </summary>
        /// <typeparam name="TDestination"></typeparam>
        /// <param name="o"></param>
        /// <returns></returns>
        public static List<TDestination> MapTo<TDestination>(this IEnumerable o)
        {
            if (o == null)
                throw new ArgumentNullException();


            foreach (var item in o)
            {
                Mapper.CreateMap(item.GetType(), typeof(TDestination));

                break;
            }
            return Mapper.Map<List<TDestination>>(o);
        }

        /// <summary>  
        /// 将 DataTable 转为实体对象  
        /// </summary>  
        /// <typeparam name="T"></typeparam>  
        /// <param name="dt"></param>  
        /// <returns></returns>  
        public static List<T> MapTo<T>(this DataTable dt)
        {
            if (dt == null || dt.Rows.Count == 0)
                return default(List<T>);

            Mapper.CreateMap<IDataReader, T>();
            return Mapper.Map<List<T>>(dt.CreateDataReader());
        }

        /// <summary>
        /// 将List转换为Datatable
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="list"></param>
        /// <returns></returns>
        public static DataTable MapToTable<T>(this IEnumerable list)
        {
            if (list == null)
                return default(DataTable);

            //创建属性的集合
            List<PropertyInfo> pList = new List<PropertyInfo>();
            //获得反射的入口
            System.Type type = typeof(T);
            DataTable dt = new DataTable();
            //把所有的public属性加入到集合 并添加DataTable的列
            Array.ForEach<PropertyInfo>(type.GetProperties(), p => { pList.Add(p); dt.Columns.Add(p.Name, p.PropertyType); });
            foreach (var item in list)
            {
                //创建一个DataRow实例
                DataRow row = dt.NewRow();
                //给row 赋值
                pList.ForEach(p => row[p.Name] = p.GetValue(item, null));
                //加入到DataTable
                dt.Rows.Add(row);
            }
            return dt;
        }

    }
}

而是前边博文意气风发出,争议重重,为此小编再写生机勃勃篇类型转变根基服务和各个Mapper结合的事例,顺便对各样Mapper做个简易的优劣势比较

其风姿洒脱静态类中有4个扩张方法,分别对Object类型,IEnumberable类型,DataTable类型增添了MapTo方法,能够方便的将指标映射到目的,集结映射到聚焦,表映射到聚焦,集结映射到表(这些效应AutoMapper不帮助,笔者用反射完毕的卡塔尔

本身对第三方组件评介有四个专门的学业,意气风发、可用性,二、质量,三、易用性

单实体转变利用方法:

本例子中三种Mapper早先小编都没动用过(因为原先本身都用本人的Mapper),这次测量试验恐怕不正确,错误的地点请大家指正

图片 1

AutoMapper使用的是4.2.1.0,需求.net4.5扶助(笔者动用Nuget没找到到.net4.0下可用的本子)

相会转化的利用方法:

EmitMapper使用的是1.0版本,使用.net4.0

图片 2

NLite使用的是0.9.6,使用.net4.0

     AutoMapper还应该有超级多效能,小编那么些类只扩展了一些最中央和常用的成效,以往用到会继续充足。

TinyMapper使用的是2.0.0.40,使用.net4.0


 生龙活虎、简单包装

1、各类Mappers封装项目截图

图片 3

2、各种Mapper封装类

图片 4

图片 5

图片 6

图片 7

3、轻巧个人第黄金年代影像

3.1 AutoMapper的dll有267k,十分的大,认为效能很圆满

  援助自定义配置,扶植静态方法和实例方法,提供私下认可实例, 匡助传Type来转变,扩张性不错,作用强盛     

3.2 EmitMapper的dll才99k,感到效果比较简便

  提供私下认可实例,扶助自定义配置

3.3 NLite的dll有646k,dll偏大,个中好多Mapper以外的成效,是个套件,假如急需中间的多项职能才相比较划算(这里不进行)

3.4 TinyMapper的dll才47k,最轻量,借使效果和性质都不打对折就无所不有了

     只扶持静态方法

二、继承类型转变科目测验

1、世袭类型转化可用性测验代码

图片 8

图片 9

图片 10

图片 11

大家要看精通,不管哪个种类Mapper,作者都以用平等方式(GlobalServices.Instance.Convert<A, B>(a))来调用的

本条、这是为了各个Mapper测验的公平性,不要讲十二分几个if那个多个哈希

其二、也正是说,种种Mapper都能够选拔“插件式”在本框架中运行,要是为了猝然意识某种Mapper工具备“bug”,能够“秒切”为另后生可畏种Mapper,全部调用的地点差少之又少都休想改善

2、测量检验结果

图片 12

没难题,以上八种Mapper轻便胜任,不过有一个一线的差异,AutoMapper是一向运用途目转变管理世襲类型的转账的,对象援用都以同四个。其余mapper应该是“copy”的

3、质量测量检验(100万次)

图片 13

A:TinyMapper最快

B:AutoMapper其次(没想了解,直接类型转变应该算“作弊”,却还并未有TinyMapper快)

C:EmitMapper和NLiteMapper各有长短,EmitMappe稍快

4、易用性不用说,都很简短

 

三、轻巧对象转变科目测验

1、测量试验代码

图片 14

图片 15

图片 16

AutoMapper居然转变失败,实在让人大失所望,网络生机勃勃查资料,供给扩张

2、对AutoMapper单独扩展再测

图片 17

图片 18

扩张后可以健康转变,何况扩大也特别简单,不过这么轻易的代码为啥非要使用者写吧?作者一时半刻还不太知道,起码易用性上是要扣分的

3、质量测量试验(10万次)

图片 19

A:TinyMapper再拔头筹(除HandCode外),可喜可贺

B:EmitMapper其次,质量不错,Emit果然效果好

C:再一次是AutoMapper,是EmitMapper的1.5倍左右,AutoMapper未有作者设想的那么差

D:NLiteMapper垫底,不老子@楚,好像网络有说NLiteMapper也是应用Emit做的,也许自个儿用的这些本子还不是Emit(为了尽或者的通用,小编尽大概使用.net4.0)

 

4、可用性计算,AutoMapper扣分,轻松映射照旧要手动注册法规

    英特网有人把每一趟使用AutoMapper时都尝试注册,纵然丑了点是个议程,不了然是或不是对质量有影响

 

四、成员名映射科目测验

1、测试代码

图片 20

AutoMapper的安顿法规

图片 21

EmitMapper的安插准绳

图片 22

TinyMapper的配备法则

图片 23

图片 24

事实上需求很简短,把A转变C,然而要把A的id属性映射到C的AId属性上,不过NLiteMapper小编没找到配置情势

2、测量检验结果

图片 25

NLiteMapper小编没找到配置情势,所以AId属性没转账成功,伊始推断NLiteMapper无法扶植这种须求

3、品质测验(10万次)

图片 26

A:TinyMapper继续头筹,并且老远抢先

B:EmitMapper其次,比TinyMapper差太远了,对这种布局法规扶持倒霉

C:再一次是AutoMapper,比TinyMapper就差更远了,照旧对这种布局法则扶持不好

D:NLiteMapper质量又垫底,何况还未达成供给

4、易用性

A:TinyMapper扩充的法子最佳“优秀”,使用表明式增添新的照射法则,得分最高

B:AutoMapper扩大的秘籍其次,因为每对项目都安插是硬伤

C:EmitMapper增添的情势有一些不好了,正是硬编码,但是质量却比硬编码差多了,比TinyMapper都差不菲(原因之后能够研商一下)

D:NLiteMapper垫底,没完成要求

 

五、树状递归转变科目测量检验

1、测量检验代码

图片 27

图片 28

如上代码是有意把TinyMapper注释了,是为着单独测验(TinyMapper会出严重错误)

2、测量检验结果

图片 29

2.1、单独测量检验TinyMapper

图片 30

A:这一次TinyMapper不行了,预计是自个儿测量试验的例证特殊,子对象的项目是自身触发了Bug,严重的bug,不只是不可能转产生功,直接死循环

    注:不知晓TinyMapper最新版本是或不是有其一难题,感兴趣的能够测验一下

B:别的三种Mapper都能独当一面

3、品质测验(10万次,除TinyMapper外)

图片 31

A:此番EmitMapper拔得头筹

B:AutoMapper和NLiteMapper大概,AutoMapper稍好一些

C:TinyMapper缺席,实践会报错

4、易用性

AutoMapper硬伤,每对品种都要配备

 

小结一下,其少年老成、网络有为数不菲开源项目组件已经很强盛了,要是能很好的未小编所用能够大大加快项目开拓的进程,以致是种类的优化(含品质);其二、网络的类型也是人支付的,总会有这样可能那样的“难题”。大家要以三个兼容并包的心怀看待那么些种类。日常的话功效康健,使用方便,bug少的属性大概不好;大家须要用其长,避其短。最佳信守“里氏代换原则”和“最少知识标准化”,如若那个组件已经不适用了足以一本万利的轮换不用满项目标改换。

本文由威尼斯发布于jave,转载请注明出处:类型转化基础服务,集合映射到表(这个功能A

关键词: