实体类与实体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类之间的转换 的相关文章

  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co

随机推荐

  • 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