实体类与实体DTO类之间的转换

2023-11-12

实体类与实体DTO类之间的转换

1.通过使用第三方序列化反序列化工具Newtonsoft.Json

通过Nuget包管理器添加Newtonsoft.Json
这里写图片描述
构造一个Trans的静态方法:

public static TOut Trans<TIn,TOut>(TIn tIn)
        {
            return JsonConvert.DeserializeObject<TOut>(JsonConvert.SerializeObject(tIn));
        }

前端调用:

People people = new People
            {
                Id = 1,
                Name = "ddd",
                Class = 1

            };
PeopleCopy peopleCopy = SerializeMapper.Trans<People, PeopleCopy>(people);

2.通过反射实现

构造一个Trans的静态方法:

public static TOut Trans<TIn,TOut>(TIn tIn)
        {
            TOut tOut = Activator.CreateInstance<TOut>();          
            foreach (var outfield in tOut.GetType().GetFields())
            {
                foreach (var infield in tIn.GetType().GetFields())
                {
                    if (outfield.Name.Equals(infield.Name))
                    {
                        outfield.SetValue(tOut, infield.GetValue(tIn));
                        break;
                    }                   
                }
            }
            foreach (var outProperty in tOut.GetType().GetProperties())
            {
                foreach (var inProperty in tIn.GetType().GetProperties())
                {
                    if (outProperty.Name.Equals(inProperty.Name))
                    {
                        outProperty.SetValue(tOut,inProperty.GetValue(tIn));
                        break;
                    }
                }

            }
            return tOut;
        }

前端调用:

People people = new People
            {
                Id = 1,
                Name = "ddd",
                Class = 1

            };
PeopleCopy peopleCopy = ReflectionMapper.Trans<People, PeopleCopy>(people);

3.通过表达式目录树加字典缓存实现

静态字典:

public static Dictionary<string, Object> _Dictionary = new Dictionary<string, object>();

构造一个Trans的静态方法:

public static TOut Trans<TIn, TOut>(TIn tIn)
        {   
            TOut tOut = Activator.CreateInstance<TOut>();
            string key = string.Format("funckey_{0}_{1}", tIn.GetType().Name, tOut.GetType().Name);
            if (!_Dictionary.ContainsKey(key))
            {
                ParameterExpression parameterExpression = Expression.Parameter(typeof(TIn), "p");
                List<MemberBinding> memberBindingsList = new List<MemberBinding>();
                foreach (var item in typeof(TOut).GetProperties())
                {
                    MemberExpression property = Expression.Property(parameterExpression, typeof(TIn).GetProperty(item.Name));
                    MemberBinding memberBinding = Expression.Bind(item, property);
                    memberBindingsList.Add(memberBinding);
                }
                foreach (var item in typeof(TOut).GetFields())
                {
                    MemberExpression filed = Expression.Field(parameterExpression, typeof(TIn).GetField(item.Name));
                    MemberBinding memberBinding = Expression.Bind(item, filed);
                    memberBindingsList.Add(memberBinding);
                }
                MemberInitExpression memberInitExpression = Expression.MemberInit(Expression.New(typeof(TOut)), memberBindingsList.ToArray());
                Expression<Func<TIn, TOut>> lambda = Expression.Lambda<Func<TIn, TOut>>(memberInitExpression, new ParameterExpression[]
                    {
                        parameterExpression
                    });
                Func<TIn, TOut> func = lambda.Compile();
                _Dictionary[key] = func;
            }
            return ((Func<TIn, TOut>)_Dictionary[key]).Invoke(tIn);
        }

前端调用:

People people = new People
            {
                Id = 1,
                Name = "ddd",
                Class = 1

            };
PeopleCopy peopleCopy = ExpressionMapper.Trans<People, PeopleCopy>(people);

4. 通过表达式目录树加泛型缓存实现(静态构造函数)

构造一个泛型缓存类:

 public class ExpressionGenericMapper<TIn,TOut>
    {
        private static Func<TIn, TOut> _FUNC = null;
        static ExpressionGenericMapper()
        {
            ParameterExpression parameterExpression = Expression.Parameter(typeof(TIn),"p");
            List<MemberBinding> memberBindingsList = new List<MemberBinding>();
            foreach (var item in typeof(TOut).GetProperties())
            {
                MemberExpression property = Expression.Property(parameterExpression, typeof(TIn).GetProperty(item.Name));
                MemberBinding memberBinding = Expression.Bind(item, property);
                memberBindingsList.Add(memberBinding);
            }
            foreach (var item in typeof(TOut).GetFields())
            {
                MemberExpression property = Expression.Field(parameterExpression, typeof(TIn).GetField(item.Name));
                MemberBinding memberBinding = Expression.Bind(item, property);
                memberBindingsList.Add(memberBinding);
            }
            MemberInitExpression memberInitExpression = Expression.MemberInit(Expression.New(typeof(TOut)), memberBindingsList.ToArray());
            Expression<Func<TIn, TOut>> lambda = Expression.Lambda<Func<TIn, TOut>>(memberInitExpression, new ParameterExpression[]
            {
                    parameterExpression
            });
            _FUNC = lambda.Compile();//拼装是一次性的
        }

        public static TOut Trans(TIn tIn)
        {
           return  _FUNC(tIn);
        }
    }

前端调用:

People people = new People
            {
                Id = 1,
                Name = "ddd",
                Class = 1

            };
PeopleCopy peopleCopy = ExpressionGenericMapper.Trans<People, PeopleCopy>(people);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体类与实体DTO类之间的转换 的相关文章

随机推荐

  • java定位_java调用百度定位api服务获取地理位置示例

    package test import java io BufferedReader import java io IOException import java io InputStream import java io InputStr
  • C++智能指针之unique_ptr(保姆级教学)

    目录 unique ptr 概述 涉及程序 初始化 手动初始化 std make unique函数 C 14 unique ptr常规操作 不支持操作 该指针不支持拷贝和赋值操作 所以不能拷贝到容器里 移动语义std move releas
  • Baxter抓取物块——基于单应性矩阵(二)

    之前写了Baxter抓取物块的视觉部分 见一 接下来说一说剩下的 比较简单的模块 机械臂末端位姿获取 Baxter启动后会将自身各坐标系的变换关系发布到 tf 话题中 我们只需要使用TF包 具体参考wiki 即可 定义的current po
  • 1-数据结构-线性表之顺序表

    定义 顺序表 主体是数组 在这基础之上 多了记录数组容量和数据个数的两个变量 从而组成了一个结构体 这里叫顺序表类型 代码 typedef struct sqlist sldatatype a int size int capacity s
  • 花旗金融2020春招面经(offer)

    面试刚开始是英文自我介绍 英文介绍项目 英文交流几个问题 接着是Java基础知识 数据库知识 面试官很好 很多问题并不会太为难你 还会询问你的工作意向 面完大概3天就来了offer 面试问题和答案主要整理如下 Java集合类 collect
  • 基于KNN-Dense sift的图像识别(手势识别)

    K 近邻算法 KNN 原理 最简单最初级的分类器是将全部的训练数据所对应的类别都记录下来 当测试对象的属性和某个训练对象的属性完全匹配时 便可以对其进行分类 但是存在一些问题 如不可能所有测试对象都会找到与之完全匹配的训练对象 其次就是存在
  • 解决vue3中 import type { FormInstance } from ‘element-plus‘出现报错

    前言 在使用element plus的form表单组件时 引入FormInstance类型 结果出现以下错误 模块 element plus 没有导出的成员 FormInstance 你是想改用 import FormInstance fr
  • upload(pass01~pass09)

    文章目录 Pass 01 Pass 02 Pass 03 Pass 04 未解决 Pass 05 失败 自己的一些尝试 后续 Pass 06 Pass 07 Pass 08 Pass 09 Pass 01 先查看提示 在客户端使用JS对图片
  • 树莓派教程 - 1.4 树莓派GPIO库wiringPi 树莓派串口ttyS0

    Git例程源码仓库 https github com ZhiliangMa raspberry git 使用树莓派的串口前 需要先了解树莓派板载的两个串口的区别 树莓派3为了增加蓝牙硬件 将独立时钟的硬件串口 dev ttyAMA0 默认分
  • 中国数字新商业发展洞察报告 附下载地址

    2019年中国数字经济规模达到35 8万亿元 同比名义增长率相比GDP高出6 7 在经济下行压力加大 外部环境复杂叠加疫情冲击的特殊时期 围绕数字经济开展新一轮科技革命与产业变革 无疑是引领经济内生动力增长 结构优化的关键 产业数字化规模占
  • 把PHP添加到IIS

    把PHP添加到IIS 把PHP添加到IIS 首先将PHP配置环境 打开IIS服务 结尾 把PHP添加到IIS 首先将PHP配置环境 首先去官网将PHP给下载下来 https www php net 然后将PHP下载的安装包里面的文件给解压到
  • 浅谈K-means算法和实现(基于Python)

    Kmeans可视化 https www naftaliharris com blog visualizing k means clustering K means原理 K means 有一个著名的解释 牧师 村民模型 有四个牧师去郊区布道
  • MYSQL七种关系图

    MYSQL七种查询关系 CREATE TABLE t blog id INT PRIMARY KEY AUTO INCREMENT title VARCHAR 50 typeId INT SELECT FROM t blog id titl
  • C/C++白盒测试系列之Cppcheck使用介绍(一)

    工具简介 下载安装 Linux 官方网址 http sourceforge net projects cppcheck 安装方式 解压后 直接make进行编译 完成后 make install进行安装 验证安装 cppcheck v 查看是
  • 删除msconfig 项目

    regeditHKEY LOCAL MACHINE SOFTWARE Microsoft Shared Tools MSConfig startupreg 转载于 https www cnblogs com kevinkim archive
  • qt5.10.1安装

    首先下载qt5 10 1 网址 http download qt io archive qt 可以找到5 10 1之后进行下载 可以发现只有x86的 实际上64位的也是都包括在里面的 安装的时候可以进行选择版本的 下载好之后进行安装 qt比
  • 二十三.Python学习笔记.5

    组合数据类型 一 集合类型及操作 1 集合是多个 元素的无序组合 集合类型与数学中的集合概念一致 集合元素之间无序 每个元素唯一 不存在相同元素 集合元素不可更改 不能是可变数据类型 2 集合是多个元素的无序组合 集合用大括号 表示 元素间
  • UEditor百度富文本编辑器实现自定义按钮和自定义右键菜单

    以1 5 0版本为例子 注意 所有字符串的字母只能小写 不能大写 自定义工具栏按钮 在根目录的ueditor config js找到toolbars参数 大于34行 在后面加上自定义字符串 然后在根目录 lang zh cn zh cn j
  • Word2016怎么制作目录

    Word2016如何制作目录 点击 引用 点击 目录 选择目录的生成方式
  • 实体类与实体DTO类之间的转换

    实体类与实体DTO类之间的转换 实体类与实体DTO类之间的转换 1 通过使用第三方序列化反序列化工具Newtonsoft Json 2 通过反射实现 3 通过表达式目录树加字典缓存实现 4 通过表达式目录树加泛型缓存实现 静态构造函数 1