C# DAO转换为DTO工具类

这篇具有很好参考价值的文章主要介绍了C# DAO转换为DTO工具类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

思想

DAO(Data Access Object)数据访问对象,是我们在做结构化数据库访问的时候传输的对象,通过这个对象我们可以与数据库中的表建立映射关系
DTO(Data Transfer Object)是我们在与前端进行数据交换时传递的对象


为什么需要设置这这两种对象呢?

  1. 为了数据安全
    如果我们直接传递DAO的数据,我们可能回把数据库的底库都扒光,比如一个用户的数据,包括用户的Id、用户的账号、密码等,我们直接传递到前端,用户的密码有可能被抓包软件给获取到,之后用户账号就可能回被盗用,而为了杜绝这种情况,我们从后端就直接把数据给换掉
  2. 除了DTO,甚至我们在某些后端与数据库进行某些数据交换的时候也会设置一个中间模型,而不是直接使用DAO,因为某些数据库表的字段过多,我们进行业务的时候可能并用不到难么多的字段,所以回进行一定的截断

转换思路

我们这里既然要转换肯定是无论是基础类型还是引用类型的属性都可以转换,所以我想到了利用反射
步骤:

  1. 获取来来源对象的所有公开属性
  2. 创建一个字典,字典的Key值为来源对象公开属性名称,字典的值为来源对象的公开属性的值
  3. 创建出目标类的对象,获取到目标类的所有公开属性
  4. 根据目标属性名称获取到来源对象属性的值,设置目标属性的值

代码实现

来源类型

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Model.Entity
{
    public class User
    {
        public int UserId { get; set; }
        // QQ邮箱
        public string QQEmail { get; set; }
        // 昵称
        public string Nickname { get; set; }
        // 密码
        public string Password { get; set; }
        // 用户状态 0:表示online 1:表示离线 2:表示对战中,-1:表示禁止登录
        public int Status { get; set; }
        // 是否是管理员 0:不是 1:是
        public bool IsAdmin { get; set; }
        // 用户的头像
        public string AvatarUrl { get; set; }
        // 获胜的场数
        public int WinNumber { get; set; }
        // 失败的场数
        public int LoseNumber { get; set; }
        // 和棋的场数
        public int DrawNumber { get; set; }
        // 排名
        public int RankNumber { get; set; }
        // 创建时间
        public DateTime CreateTime { get; set; }
        // 修改时间
        public DateTime UpdateTime { get; set; }
    }
}


目标类型


namespace gobangBack.DTO
{
    public record UserDTO
    {
        public int UserId { get; set; }
        // QQ邮箱
        public string QQEmail { get; set; }
        // 昵称
        public string Nickname { get; set; }
        // 用户状态 0:表示online 1:表示离线 2:表示对战中,-1:表示禁止登录
        public int Status { get; set; }
        // 是否是管理员 0:不是 1:是
        public bool IsAdmin { get; set; }
        // 用户的头像
        public string AvatarUrl { get; set; }
        // 获胜的场数
        public int WinNumber { get; set; }
        // 失败的场数
        public int LoseNumber { get; set; }
        // 和棋的场数
        public int DrawNumber { get; set; }
        // 排名
        public int RankNumber { get; set; }
    }
}



using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace Tool
{
    // 将参数Param转换为Target类型
    public static  class TypeExtract
    {
        /// <summary>
        /// 将对应的类型转换为我们要转换的类型
        /// </summary>
        /// <param name="source"></param>
        /// <param name="target"></param>
        public static T TransformToTargetBased<E,T>(E source,Type target,bool ignoreNull=false) where T:new()
        {
            // 1.获取到来源类的所有公开的属性
            PropertyInfo[] sourceInfos = source.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);

            // 2.将其转换为一个Key:属性名,Value:属性值的字典
            Dictionary<string, object> sourceDictionary = new Dictionary<string, object>();
            foreach (PropertyInfo sourceInfo in sourceInfos)
            {
                sourceDictionary[sourceInfo.Name] = sourceInfo.GetValue(source);
            }

            // 3.获取到我们的目标类型的所有的属性
            T targetObj = new T();
            PropertyInfo[] targetInfos = targetObj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
            // 4.将来源对象的值转载到目标对象上
            foreach (PropertyInfo targetInfo in targetInfos) {
                // 5.判断是否忽略空值
                if(ignoreNull)
                {
                    // 6.如果是忽略空值,则值为null的话就省略
                    if(sourceDictionary[targetInfo.Name] != null)
                    {
                        targetInfo.SetValue(targetObj, sourceDictionary[targetInfo.Name]);
                    }
                    continue;
                }
                else
                {
                     // 7.1.首先判断目标的类属性名是否在我们的字典中有,如果有才赋值
                    if(sourceDictionary.ContainsKey(targetInfo.Name))
                    	targetInfo.SetValue(targetObj, sourceDictionary[targetInfo.Name]);
                }
            }
            return targetObj;
        }
    }
}


最后我再写一个Api测试一下

[HttpGet]
public UserDTO Get() {
	User user = context.Users.Where(u => u.UserId == 1).Single();
	UserDTO usreDto = TypeExtract.TransformToTargetBased<User,UserDTO>(user,new UserDTO().GetType());
	return usreDto;
}

C# DAO转换为DTO工具类


呼哈,成功,这个工具类我测试过,不仅仅是基本类型可以转换,里面的属性如果是引用类型一样可以转换,如果大家有更好的方法,希望大家分享出来,谢谢!文章来源地址https://www.toymoban.com/news/detail-746189.html


到了这里,关于C# DAO转换为DTO工具类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 后端开发基础概念 Entity,DAO,DO,DTO,VO, Service,Controller

    Entity主要用于ORM(对象关系映射)框架中,如Hibernate、MyBatis等,以便将数据库中的数据映射为对象,方便进行业务操作。 Entity通常与数据库表一一对应,代表 业务数据 的基本单元。 通常放在项目的model或entity包下。   DAO(数据访问对象): DAO是连接业务逻辑和数据库的桥

    2024年04月08日
    浏览(30)
  • Util、POJO、domain、entity、model、DAO、DTO、view、mapper、service、controller的作用和区别分析

    @[TOC]Util、POJO、domain、entity、model、DAO、DTO、view、mapper、service、controller的作用和区别分析 前言 做开发项目时,总会遇到这些包,理清他们的层次,非常有助于我们对于项目的理解和建立。 现阶段CSDN上貌似没有很系统,很详细的关于层级类的解释。因此总结了一下自己的经

    2024年02月07日
    浏览(28)
  • Spring Boot DTO 示例 - 实体到 DTO 的转换

    在本教程中,我们将学习如何在 Spring Boot 应用程序中 创建 DTO(数据传输对象)类,以及如何使用 ModelMapper 库将实体转换为 DTO,反之亦然。 数据传输对象设计模式是一种常用的设计模式。它基本上用于一次性将具有多个属性的数据从客户端传递到服务器,以避免多次调用远

    2024年02月06日
    浏览(29)
  • 【Jetpack】使用 Room 框架访问 Android 平台 SQLite 数据库 ( 导入依赖 | 定义 Entity 实体类 | 定义 Dao 数据库访问对象接口 | 定义数据库实例类 )

    对于 Room 框架 来说 , 使用 Java 语言 开发和使用 Kotlin 语言 开发 , 需要在 build.gradle 构建脚本 中进行不同的配置 , 主要有以下两个配置不同 : 应用的插件不同 ; 导入依赖库方式不同 ; 应用插件 应用的插件区别 : 如果使用 Java 语言开发 , 只需要导入 android 插件 ; 如果使用 Kotli

    2024年02月05日
    浏览(46)
  • 用栈的思想实现将一个十进制数字转换为八进制--数据结构

    魔王的介绍:😶‍🌫️一名双非本科大一小白。 魔王的目标:🤯努力赶上周围卷王的脚步。 魔王的主页:🔥🔥🔥大魔王.🔥🔥🔥 ❤️‍🔥大魔王与你分享:“并不是你喝了一瓶雪花,就有人愿意陪你勇闯天涯。” 学完栈的思想后,我们知道了栈只能从栈顶进出,如果

    2023年04月24日
    浏览(30)
  • DTO,VO,PO的意义与他们之间的转换

    DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。再通俗一

    2024年02月11日
    浏览(31)
  • C#操作Access数据库

    Access数据的优点: 1,存储方式单一 Access管理的对象有表、查询、窗体、报表、页、宏和模块,以上对象都存放在后缀为 .mdb 的数据库文件中,便于用户的操作和管理。 2,面向对象 3,界面友好,易操作 4,轻量级,数据库(.mdb)文件可以直接加载到C#项目文件里(个人认为它最

    2024年02月04日
    浏览(42)
  • DTO、VO、BO、PO、DO理解等相关的转换

    pojo(domain/entity)一般定义实体类,实体类又被分为VO、BO、 PO、 DTO、DO;通过各层POJO的使用,有助于提高代码的可读性和可维护性。 DO(Data Object):此对象与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。 DTO(Data Transfer Object):数据传输对象,Service 或 Manager 向外传输的对

    2024年02月07日
    浏览(22)
  • C#实现对Access数据库的通用操作

      ①实现创建Access数据库;   ②实现创建指定Access数据库的表;   ③实现给Access数据库的指定表【插入、查询、更新、删除、分页查询】数据;   ④实现获取Access数据库中的所有表名称及其表包含的所有列名称 该项目的完整工程下载地址如下: Access数据库操作项目的完整工程

    2024年02月08日
    浏览(49)
  • 使用JDBC访问微软Access数据库实例

    之前有使用ODBC来访问Access数据库的,但不方便.   是否可以使用JDBC访问, 网上的说法不一, 也很少有实例参考. //        access由于access并不是作为一项服务运行,所以url的方法对他不适用。  ( 其实这个是不对的. ) //        https://zhuanlan.zhihu.com/p/441219492 //        Access

    2024年02月15日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包