【C#】实体类和DataTable之间相互转换,实体反射动态遍历列

news2024/11/15 15:29:53

在实际项目中,经常会用到数据之间的相互转换,序列化和反序列化就是常见场景。这里我们只简单聊聊实体类和DataTable之间的相互转换,可以用于不同业务场景使用。

目录

  • 1、DataTable转Model
  • 2、Model转DataTable
  • 3、反射概念
    • 3.1、Type 类型
    • 3.2、Assembly 程序集
    • 3.3、MemberInfo 成员信息
    • 3.4、PropertyInfo 属性信息

1、DataTable转Model

要将C# DataTable 转换为 Model 实体类,你可以使用反射来获取 DataTable 的列和值,并通过实例化 Model 类来赋值。

1)将 DataTable 转换为 Model 类

  • 示例代码
using System;
using System.Collections.Generic;
using System.Data;
using System.Reflection;

public static class DataTableExtensions
{
    public static List<T> ToList<T>(this DataTable dataTable) where T : class, new()
    {
        List<T> list = new List<T>();

        foreach (DataRow row in dataTable.Rows)
        {
            T obj = new T();

            foreach (DataColumn col in dataTable.Columns)
            {
                PropertyInfo property = typeof(T).GetProperty(col.ColumnName);
                if (property != null && row[col] != DBNull.Value)
                {
                    property.SetValue(obj, row[col]);
                }
            }

            list.Add(obj);
        }

        return list;
    }
}

2) DataTable 转换为指定的 Model 实体类

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

DataTable dataTable = new DataTable();
dataTable.Columns.Add("Id", typeof(int));
dataTable.Columns.Add("Name", typeof(string));
dataTable.Columns.Add("Age", typeof(int));

dataTable.Rows.Add(1, "John", 25);
dataTable.Rows.Add(2, "Jane", 30);
dataTable.Rows.Add(3, "Mike", 40);

List<Person> persons = dataTable.ToList<Person>();
  • 运行效果
    在这里插入图片描述

上述代码将会创建一个包含了 DataTable 数据的 Person 实体类的 List。每个列的数据将会分配给 Person 对应的属性。
请注意,上述示例中的 Person 类只是一个示例,你可以根据自己的需求创建自定义的实体类,并根据 DataTable 的列名称和类型匹配属性。另外,还需确保对应的属性存在,并且列的值类型与属性类型兼容。

2、Model转DataTable

要将C# 实体通过反射转换为 DataTable,可以使用System.Reflection命名空间中的类来访问实体的属性和值,并将其添加到 DataTable 中。
1)使用反射来转换实体为 DataTable

using System;
using System.Data;
using System.Reflection;

public static class EntityExtensions
{
    public static DataTable ToDataTable<T>(this T[] entities)
    {
        DataTable dataTable = new DataTable(typeof(T).Name);

        PropertyInfo[] properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

        foreach (PropertyInfo propInfo in properties)
        {
            dataTable.Columns.Add(propInfo.Name, propInfo.PropertyType);
        }

        foreach (T entity in entities)
        {
            object[] values = new object[properties.Length];
            for (int i = 0; i < properties.Length; i++)
            {
                values[i] = properties[i].GetValue(entity);
            }

            dataTable.Rows.Add(values);
        }

        return dataTable;
    }
}

2)将任何实体数组转换为 DataTable

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

Person[] persons = new Person[]
{
    new Person { Id = 1, Name = "John", Age = 25 },
    new Person { Id = 2, Name = "Jane", Age = 30 },
    new Person { Id = 3, Name = "Mike", Age = 40 }
};

DataTable dataTable = persons.ToDataTable();
  • 运行效果
    在这里插入图片描述

上述代码将会创建一个包含了Person实体数组数据的 DataTable。每个属性都会成为该 DataTable 的列,并且每个实体实例将会形成 DataTable 的一行。
请注意,上述示例中的实体类 Person 只是一个示例,你可以根据自己的需求创建自定义的实体类,并使用相应的属性和类型。

3、反射概念

C# 的反射是指在运行时获取、检查和操作程序集、类型、成员(如字段、属性、方法等)的能力。反射提供了一组类和方法,可以在运行时动态地获取程序集和类型的信息,并使用这些信息来创建对象、调用方法、访问属性等。

以下是一些关键概念和用途:

3.1、Type 类型

Type 类型是反射的核心,它表示在运行时加载的类型。Type 类型提供了获取类型信息的方法和属性,如名称、基类、实现的接口、属性、方法、字段等。利用 Type 类型,你可以动态地获取和操作类型的信息。

3.2、Assembly 程序集

Assembly 类型表示一个程序集,它是一个逻辑单元,包含可执行文件、动态链接库或代码的容器。通过反射,你可以加载和检查程序集的信息,包括类型、成员、属性等。可以使用 Assembly 类型来加载程序集、获取程序集中的类型、创建对象等。

3.3、MemberInfo 成员信息

MemberInfo 类型表示类型的成员,如字段、属性、方法、事件等。它提供了获取成员的名称、类型、访问修饰符等信息的方法。

3.4、PropertyInfo 属性信息

PropertyInfo 类型表示类型的属性,它提供了获取和设置属性值的方法和属性。

通过反射,你可以实现许多动态和灵活的功能,如:

  • 动态创建对象和调用方法:在运行时根据类型信息动态创建对象,调用对象的方法。
  • 动态访问和修改属性值:在运行时获取对象的属性信息,并动态修改属性值。
  • 获取和检查类型信息:在运行时获取类型的信息,如名称、基类、实现的接口、成员等。
  • 加载和使用外部程序集:动态加载和使用外部程序集,以便在运行时访问和操作其中的类型和成员。
  • 编写通用代码:使用反射可以编写通用、灵活的代码,以适应不同类型和成员的情况。

需要注意的是,反射在一定程度上会带来性能上的损失,因为它需要在运行时进行类型信息的获取和检查。因此,在使用反射时需要权衡性能和灵活性之间的关系,并注意避免不必要的反射操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/712325.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣 669. 修剪二叉搜索树

题目来源&#xff1a;https://leetcode.cn/problems/trim-a-binary-search-tree/description/ C题解1&#xff1a;递归法。当前节点为空时返回空&#xff0c;不为空时对其值进行分类讨论。以low为例&#xff0c;当前节点值等于low时&#xff0c;意味着其左子树都要丢弃&#xf…

uniapp小程序进入横屏页面后竖屏页面样式错乱放大

问题描述&#xff1a;进入横屏页面后退出再进入一个竖屏页面&#xff0c;样式会错乱放大 解决方法 1.新增一个空白页&#xff0c;blank.vue <template> </template><script>export default {data() {return {}},onLoad(options) {uni.navigateBack({delta…

青岛大学_王卓老师【数据结构与算法】Week03_10_线性表的链式表示和实现10_学习笔记

本文是个人学习笔记&#xff0c;素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享&#xff0c;另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权&#xff0c;请留言作删文处理。 课程视频链接&#xff1a; 数据结构与算法基础–…

ASP.NET Core 中文文档 第四章 MVC(4.3)过滤器

ASP.NET MVC 过滤器 可在执行管道的前后特定阶段执行代码。过滤器可以配置为全局有效、仅对控制器有效或是仅对 Action 有效。 查看或下载演示代码. 过滤器如何工作&#xff1f; 不同的过滤器类型会在执行管道的不同阶段运行&#xff0c;因此它们各自有一套适用场景。根据你…

攻防视角下的信息收集组合拳-蓝队视角

攻防视角下的信息收集组合拳-蓝队视角 背景蓝队角度一、攻击前的信息收集1、企业资产梳理2、企业敏感文件清理 二、被攻击后的信息收集1、入侵成功信息收集技巧2、入侵失败信息收集技巧-锁定攻击IP反制技巧 背景 红蓝对抗中&#xff0c;最为重要的就是信息收集&#xff0c;无论…

国外追踪水资源短缺的6幅干旱地图

今天为大家分享国外6个干旱地图&#xff0c;这些地图使我们能够通过最新信息了解干旱的严重程度和范围。 它们通过捕捉水的可用性等关键信息&#xff0c;以便我们能够主动规划和应对干旱的影响。 全球干旱信息系统(GDIS) 地图网址&#xff1a; https://experience.arcgis.co…

HarmonyOS/OpenHarmony应用开发-Stage模型UIAbility组件使用(二)

UIAbility组件启动模式 UIAbility的启动模式是指UIAbility实例在启动时的不同呈现状态。针对不同的业务场景&#xff0c;系统提供了三种启动模式&#xff1a; singleton&#xff08;单实例模式&#xff09; standard&#xff08;标准实例模式&#xff09; specified&#xff0…

青少年机器人技术一级核心知识点、水平要求和考试标准

青少年机器人技术的发展已成为当今世界科技领域中备受瞩目的一项技术。机器人技术的应用范围越来越广泛&#xff0c;不仅在工业制造、医疗、教育等领域中得到广泛应用&#xff0c;同时也成为了青少年学习STEM&#xff08;科学、技术、工程、数学&#xff09;的重要内容。 为了…

错误: 字段“datlastsysoid“不存在(Navicat报错)

公司项目用到Postgres数据库&#xff0c;可视化管理工具我一般用的Navicat&#xff0c;之前也没有怎么用过Postgres数据库&#xff0c;自然对应的pgAmin工具也不是用起来也不是很友好&#xff0c;所以偷懒用Navicat&#xff0c;连接成功后&#xff0c;报错如下&#xff1a; 查…

ssm 招聘信息管理系统-计算机毕设 附源码78049

ssm 招聘客户管理系统 摘 要 由于数据库和数据仓库技术的快速发展&#xff0c;招聘客户管理系统建设越来越向模块化、智能化、自我服务和管理科学化的方向发展。招聘客户系统对处理对象和服务对象&#xff0c;自身的系统结构&#xff0c;处理能力&#xff0c;都将适应技术发展的…

vue3+ ts引入天地图 搜索功能+地理区域选择

前言&#xff1a; 天地图为开发者提供应用程序开发接口和在线服务资源&#xff0c;可满足各类基于地理信息的应用开发需求。 引入 <script src"http://api.tianditu.gov.cn/api?v4.0&tk你注册的key" type"text/javascript"></script>使…

Spring容器

1. Spring核心容器介绍 问题&#xff1a;按照Bean名称获取Bean有什么弊端&#xff0c;按照Bean类型获取Bean有什么弊端&#xff1f; 1.1 创建容器 方式一&#xff1a;类路径加载配置文件 ApplicationContext ctx new ClassPathXmlApplicationContext("applicationCon…

14. 向用户推荐朋友收藏的商品

文章目录 题目需求思路一&#xff1a;使用 Except实现一实现二&#xff1a;使用 Except思路三&#xff1a;使用 full outer join where实现三实现四&#xff1a;使用 not in concat题目来源 题目需求 现请向所有用户推荐其朋友收藏但是用户自己未收藏的商品&#xff0c;请从…

阻抗计算,真的没有那么难!

问&#xff1a;什么是阻抗&#xff1f; 答&#xff1a;在具有电阻、电感和电容的电路里&#xff0c;对电路中的电流所起的阻碍作用叫做阻抗。 问&#xff1a;什么是阻抗匹配? 答&#xff1a;阻抗匹配是指信号源或者传输线跟负载之间达到一种适合的搭配。阻抗匹配主要有两点作用…

ubuntu git clone 失败

命令行报错如下&#xff1a; gitxxx.xx.com: Permission denied (publickey). fatal: 无法读取远程仓库。修改步骤&#xff1a; 1、.ssh权限配置问题 .ssh 文件夹权限 755 或 700 config 文件权限 644 id_rsa 文件权限 600 id_rsa.pub 文件权限 644 r&#xff1a;read 代表读…

VMware安装Centos7并初始化网络使外部可以访问

本文目录 1&#xff1a;下载镜像2&#xff1a;安装centos7虚拟机2.1:初始化虚拟机2.2 初始化系统2.3 修改虚拟机网络模式 3&#xff1a;配置VMware虚拟网络编辑器4&#xff1a;配置centos网络4.1 修改网络配置文件4.2 刷新网络配置 5 验证网络总结 1&#xff1a;下载镜像 进入…

Web3.0在互联网圈爆红,这个“新一轮”概念有哪些机会?

在互联网行业里&#xff0c;新概念和潮流层出不穷&#xff0c;每一个概念都伴随着一轮火热的讨论和关注。从区块链到元宇宙&#xff0c;互联网的发展一直在不断地推动着新的创新和变革。而如今&#xff0c;Web3.0 成为了最新的热点话题&#xff0c;引起了互联网、科技和金融领域…

vue_前后端分离-增删改操作

增加操作和修改操作: 两个操作放一个页面进行操作 使用插槽(scope.row)的方式获取列表中的每一行数据 <template slot-scope"scope"><el-buttonsize"mini"click"openEditDialog( scope.row)">编辑</el-button>在进行添加的…

迅为RK3568开发板Buildroot 系统自启动 QT 程序

本小节将讲解如何开机自启动 QT 程序。 在设置自启动 QT 程序之前&#xff0c;首先要编译好 QT 可执行程序&#xff0c;完成以下两步。 1、 已经根据 03_【北京迅为】itop-3568 开发板快速使用编译环境 ubuntu18.04 v1.0.doc 第 10 章节进行了 QT 程序的交叉编译 2、 将交叉…

华为OD机试真题B卷 Python 实现【内存资源分配】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、Python算法源码六、效果展示1、输入2、输出 3、说明4、如果改一下呢&#xff1f; 一、题目描述 有一个简易内存池&#xff0c;内存按照大小粒度分类&#xff0c;每个粒度有若干个可用内存资源&#xff0c;用户会进行…