LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

如何在 C# 中将 DataTable 转换为对象列表

admin
2025年3月22日 13:59 本文热度 120

前言

在 .NET 中,DataTable 是用于内存数据存储的核心类,常用于数据库操作、数据绑定和临时数据管理。它可以从数据库、XML 文件、 CSV 文件等多种数据源中加载数据。然而,在某些情况下,需将DataTable转换为对象列表,使数据处理更加便捷。本文将介绍如何实现DataTable 转为对象列表。

实现转换

1、使用 JSON 序列化和反序列化实现

使用 JSON 方式实现,是将 DataTable 序列化为 JSON 字符串,然后再将 JSON 字符串反序列化为对象列表。实现代码简洁且较为方便。

  • 定义转换方法

定义一个泛型的转换方法,此法接受 DataTable 并将其转换为 List<T> ,其中 T 可以是任何对象类型。

public static List<TToConvertList<T>(this DataTable datatablewhere T : new(){    List<T> resultList = new List<T>();    try    {        // 将 DataTable 列化为JSON,然后反序列化为 List<T>         var jsonDataTable = JsonConvert.SerializeObject(datatable, Formatting.Indented,            new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });        resultList = JsonConvert.DeserializeObject<List<T>>(jsonDataTable);    }    catch (Exception exception)    {        // 必要时记录或处理错误        Console.WriteLine("将DataTable转换为列表时出错: " + exception.Message);    }    return resultList;}

方法代码说明

首先,将 DataTable 序列化为 JSON 格式。这可以轻松转换为任何对象类型的格式保留结构和数据。

然后,将 JSON 反序列化为 List<T>,其中 T 是我们所需的对象类型。

最后,返回 List<T> ,其中填充了 T 类型的对象,每个对象表示为 DataTable 中的一行。

  • 使用转换方法

当我们有一个用户的表数据,需要将其转换为用户对象列表,以下是使用转换方法实现的示例。

// 定义用户类public class User{    /// <summary>    /// 用户    /// </summary>    public int UserId { getset; }    /// <summary>    /// 名称    /// </summary>    public string UserName { getset; }    /// <summary>    /// 邮箱    /// </summary>    public string Email { getset; }}private static List<UserGetUserList(){    DataTable userTable = new DataTable();    userTable.Columns.Add("UserId");    userTable.Columns.Add("UserName");    userTable.Columns.Add("Email");    DataRow userRow = userTable.NewRow();    userRow["UserId"= 1000;    userRow["UserName"= "admin";    userRow["Email"= "adminuser@qq.com";    // 使用转换方法    List<User> users = ToConvertList<User>(userTable);    return users;}

  • 注意事项

Null 处理: 忽略 DataTable 中的任何 null 值,确保干净转换。

性能和数据量:对于大数据量的DataTable,JSON 序列化和反序列化的性能可能会成为问题,因为涉及到字符串的转换操作。

数据匹配: 确保 DataTable 的列名与对象类的属性名匹配,否则 JSON 转换可能失败或产生意外结果。

2、使用反射实现

使用反射可以实现将DataTable转换为对象列表,此方式通用性较强,适用于大多数场景。

  • 定义转换方法

定义一个泛型的转换方法,此法接受 DataTable 并将其转换为 List<T> ,其中 T 可以是任何对象类型。
public static List<TConvertDataTableToList<T>(DataTable dataTablewhere T : new(){    List<T> resultList = new List<T>();    foreach (DataRow row in dataTable.Rows)    {        T tagetObject = new T();        foreach (DataColumn column in dataTable.Columns)        {            string columnName = column.ColumnName;            PropertyInfo property = typeof(T).GetProperty(columnName, BindingFlags.Public | BindingFlags.Instance);            if (property != null)            {                if (property.PropertyType == typeof(DateTime?))                {                    DateTime? dateTime = null;                    string dateString = row[columnName].ToString();                    DateTime parsedDate;                    if (DateTime.TryParse(dateString, out parsedDate))                    {                        dateTime = parsedDate;                    }                    property.SetValue(tagetObject, dateTime);                    continue;                }                if (property.PropertyType == typeof(int?))                {                    int? intData = null;                    string dateString = row[columnName].ToString();                    int parsedDate;                    if (int.TryParse(dateString, out parsedDate))                    {                        intData = parsedDate;                    }                    property.SetValue(tagetObject, intData);                    continue;                }                if (property.PropertyType == typeof(bool?))                {                    bool? boolData = null;                    string dateString = row[columnName].ToString();                    bool parsedDate;                    if (bool.TryParse(dateString, out parsedDate))                    {                        boolData = parsedDate;                    }                    property.SetValue(tagetObject, boolData);                    continue;                }                if (property.PropertyType == typeof(decimal?))                {                    decimal? decimalData = null;                    string dateString = row[columnName].ToString();                    decimal parsedDate;                    if (decimal.TryParse(dateString, out parsedDate))                    {                        decimalData = parsedDate;                    }                    property.SetValue(tagetObject, decimalData);                    continue;                }                object value = Convert.ChangeType(row[columnName], property.PropertyType);                property.SetValue(tagetObject, value);            }        }        resultList.Add(tagetObject);    }    return resultList;}

方法代码说明

首先,将遍历 DataTable 的行和列,外层循环遍历DataTable的每一行,内层循环遍历每一列。

然后,通过反射获取目标对象T的属性,并将DataTable中对应列的值赋给该属性。

最后,返回 List<T> ,其中填充了 T 类型的对象,每个对象表示为 DataTable 中的一行。

  • 使用转换方法

// 定义用户类public class User{    /// <summary>    /// 用户    /// </summary>    public int UserId { getset; }    /// <summary>    /// 名称    /// </summary>    public string UserName { getset; }    /// <summary>    /// 邮箱    /// </summary>    public string Email { getset; }}private static List<UserGetUserList(){    DataTable userTable = new DataTable();    userTable.Columns.Add("UserId");    userTable.Columns.Add("UserName");    userTable.Columns.Add("Email");    DataRow userRow = userTable.NewRow();    userRow["UserId"= 1000;    userRow["UserName"= "admin";    userRow["Email"= "adminuser@qq.com";    // 使用转换方法    List<User> users = ConvertDataTableToList<User>(userTable);    return users;}

  • 注意事项

属性大小写敏感:对象属性的大小写一定要与DataTable中列名一致,否则无法获取到数据。

性能问题反射在运行时获取类型信息,性能开销相对较大,对于大数据量的DataTable转换,可能会影响程序性能。

小结

以上是两种常见实现方法,我们可以根据实现需求和场景选择合适的方式将 DataTable 转换为对象列表,从而更高效地处理和使用数据。


阅读原文:原文链接


该文章在 2025/3/24 16:40:06 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved