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

这篇具有很好参考价值的文章主要介绍了【C#】实体类和DataTable之间相互转换,实体反射动态遍历列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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>();
  • 运行效果
    c#datatable转实体,C#,c#,windows

上述代码将会创建一个包含了 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();
  • 运行效果
    c#datatable转实体,C#,c#,windows

上述代码将会创建一个包含了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 类型表示类型的属性,它提供了获取和设置属性值的方法和属性。

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

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

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

4、常见问题

1)当实体类有成员定义成可空类型时,如果不做处理,那么会报错
c#datatable转实体,C#,c#,windows
c#datatable转实体,C#,c#,windows
2)在 DataSet 中,确实不支持直接使用 System.Nullable<> 类型。

如果你想在 DataTable 的列中使用可为空的类型,你可以使用 System.Object 类型,并在需要时将其设置为 DBNull.Value 来表示空值。

DataTable dataTable = new DataTable();

// 添加可为空的整数列
DataColumn nullableIntColumn = new DataColumn("NullableInt", typeof(object));
dataTable.Columns.Add(nullableIntColumn);

// 添加可为空的字符串列
DataColumn nullableStringColumn = new DataColumn("NullableString", typeof(object));
dataTable.Columns.Add(nullableStringColumn);

在上述代码中,我们创建了一个 DataTable 对象 dataTable,并添加了两个列:NullableInt 和 NullableString。

为了将列定义为可为空类型,我们使用了 typeof(object) 来定义列的类型,这样可以允许任意的对象,并且可以在需要时将其设置为 DBNull.Value 来表示空值。

3)在 DataTable 的列中存储可为空的值,例如:

DataRow row = dataTable.NewRow();
row["NullableInt"] = DBNull.Value; // 可空整数为空,使用 DBNull.Value 表示
row["NullableString"] = DBNull.Value; // 可空字符串为空,使用 DBNull.Value 表示
dataTable.Rows.Add(row);

通过这种方式,你可以在 DataTable 的列中处理可为空的类型,并使用 DBNull.Value 来表示空值。请注意,在读取和处理数据时,你需要检查某个列的值是否为 DBNull.Value,以判断是否为空文章来源地址https://www.toymoban.com/news/detail-615196.html

到了这里,关于【C#】实体类和DataTable之间相互转换,实体反射动态遍历列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Java中实体与Map的相互转换

    一、在Java中,可以通过以下方法将实体类转换为Map: 利用Java反射机制: 利用Java 8 Stream API: 以上两种方法都可以将实体类转换为Map。需要注意的是,这些方法仅会将实体类中的属性转换为Map中的键值对,不会包含方法、构造器、父类属性等其他部分。 二、要将map转换为实

    2024年02月05日
    浏览(29)
  • 【Java alibaba&hutool】JSON、Map、实体对象间的相互转换

            首先要知道三者的互转关系,可以先将JSON理解成是String类型。这篇博文主要是记录阿里巴巴的JSONObject的两个方法。toJSONString()以及parseObject()方法。顺便巩固Map与实体对象的转换技巧。         综上:这里所学得知识使用fastjson是实现Map -- JSON - Bean。其余由糊涂

    2024年02月07日
    浏览(33)
  • C# JSON转为实体类和List,以及结合使用

    json 实现 json : 两个类 : 实现 json : 两个类 : 实现

    2024年02月07日
    浏览(22)
  • java byte数组与int之间相互转换

    运算符 含义 说明 与 对应位都是1,结果为1,否则为0 | 或 对应位都是0,结果为0,否则为1 ~ 取反 每一位变相反位,即0变成1,1变成0 ^ 异或 对应位值相同,结果为0,否则为1 左移位 低位补0 右移位 保留符号位,0为正,1为负 无符号右移位 高位补0 位逻辑运算示例 A B AB A|B

    2024年04月14日
    浏览(38)
  • Java中List与数组之间的相互转换

    List列表中存储对象,如 ListInteger 、 ListString 、 ListPerson ,对象数组中同样存储相应的对象,如Integer[]、String[]、Person[],对象数组与对象List的转换可通过如下方式实现: (一)对象List转对象数组 1、toArray()方法 直接调用对象List的toArray()方法转换为对象数组,该方法的参数是

    2024年02月16日
    浏览(36)
  • JSON转换:实体类和JSONObject互转,List和JSONArray互转(fastjson版)

         //1.java对象转化成String      String s=JSONObject.toJSONString(javaObject.class);       //2. java对象转化成Object         Object str=JSONObject.toJSON(javaObject.class);       //3.String类型转json对象        JSONObject jsonObject= JSONObject.parseObject(str);       //4. String转Object         Obj

    2024年02月14日
    浏览(33)
  • java中日期转换Date、DateTime、TimeStamp、String之间相互转换

    1.1Date-String 2.1Date-TimeStamp 2.2TimeStamp-Date DateTime使用依赖 3.1Date-DateTime 方法1: 方法2: 3.2DateTime-Date 4.String转DateTime

    2024年02月15日
    浏览(49)
  • Java 中图片与二进制之间如何相互转换?

    1、 下面是一个完整的代码示例。 指定文件路径转为二进制 将网络图片转为二进制 base64 转为图片资源 2、如何判断 base64 图片的格式? 3、将网络图片转为 base64 字符串 4、将 base64 字符串转为图片输出 注:该方法的入参,base64 格式文件不得有 文件头部标识信息,否则会转换

    2024年02月10日
    浏览(38)
  • Json对象和Json字符串之间相互转换

    作为前端开发,在和后端进行联调接口时,总会遇到要求传JSON字符串或是JSON对象,或者是返回值里是JSON字符串要在页面上展示JSON对象这种情况,都需要前端开发人员对Json对象和Json对象进行相互转换,得到想要的结果。 废话不多说,直接上干货: 1.首先定义一个Json对象:

    2024年02月11日
    浏览(41)
  • 无缝数据转换!使用C++ 实现 Excel文件与CSV之间的相互转换

    CSV格式是一种通用的文本文件格式,可在多个应用程序之间共享和使用。相比之下,Excel文件是一种电子表格格式,通常只能在Microsoft Excel中编辑和查看。因此,将Excel文件转换为CSV格式可使数据更方便地在其他应用程序中使用;而将CSV文件转换为Excel格式则有利于在Microsoft

    2024年02月11日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包