C#中DataTable和List互转的示例代码

下面我将详细讲解“C#中DataTable和List互转的示例代码”的完整攻略。

目录

  1. DataTable转List
    1.1 使用ToList扩展方法
    1.2 使用反射自动映射
  2. List转DataTable
    2.1 使用数据表生成方式
    2.2 使用反射自动映射

1. DataTable转List

1.1 使用ToList扩展方法

public static List<T> DataTableToList<T>(DataTable dataTable) where T : class, new()
{
    var list = new List<T>();
    foreach (DataRow row in dataTable.Rows)
    {
        var obj = new T();
        foreach (var property in typeof(T).GetProperties())
        {
            if (dataTable.Columns.Contains(property.Name))
                property.SetValue(obj, Convert.ChangeType(row[property.Name], property.PropertyType));
        }
        list.Add(obj);
    }
    return list;
}

上述代码中我们定义了一个静态方法DataRowToList,用于将DataTable转为List。其中T代表目标类型,这里使用泛型参数来实现通用性。

通过遍历DataRow,我们创建新对象T,并将DataRow的每个字段复制到对象T的属性中。为了确保映射的成功,代码中针对DataRow的每个字段均执行了相应的类型转换,包括空值判断、类型转换等。

使用方法:

var dataTable = new DataTable();
dataTable.Columns.Add("Name");
dataTable.Columns.Add("Age");
dataTable.Rows.Add("Tom", 18);
dataTable.Rows.Add("Jerry", 20);
var list = DataTableToList<Student>(dataTable);

上述代码中我们首先创建了一个包含两条记录的DataTable。接着调用我们刚刚定义的静态方法,将DataTable转为List。最终我们得到了一个包含两个学生实例的列表。

1.2 使用反射自动映射

public static List<T> DataTableToList<T>(DataTable dataTable) where T : new()
{
    var list = new List<T>();
    foreach (DataRow row in dataTable.Rows)
    {
        var obj = new T();
        foreach (PropertyInfo property in typeof(T).GetProperties())
        {
            if (!dataTable.Columns.Contains(property.Name)) continue;
            if (row[property.Name] != DBNull.Value)
                property.SetValue(obj, row[property.Name]);
        }
        list.Add(obj);
    }
    return list;
}

这段代码同样实现了DataTable转List的功能。不同的是,这里使用了反射技术,自动将DataRow的每个字段映射到目标对象的属性中。

这里省略了类型转换的过程,实践中需要根据具体情况添加相关代码逻辑。

使用方法:

var dataTable = new DataTable();
dataTable.Columns.Add("Name");
dataTable.Columns.Add("Age");
dataTable.Rows.Add("Tom", 18);
dataTable.Rows.Add("Jerry", 20);
var list = DataTableToList<Student>(dataTable);

同样是通过静态方法调用,我们实现了DataTable到List的迁移。

2. List转DataTable

2.1 使用数据表生成方式

public static DataTable ListToDataTable<T>(List<T> list)
{
    var dataTable = new DataTable();
    foreach (var property in typeof(T).GetProperties())
        dataTable.Columns.Add(property.Name, Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType);
    foreach (var item in list)
    {
        var dataRow = dataTable.NewRow();
        foreach (var property in typeof(T).GetProperties())
            dataRow[property.Name] = property.GetValue(item) ?? DBNull.Value;
        dataTable.Rows.Add(dataRow);
    }
    return dataTable;
}

上述代码中我们定义了一个静态方法ListToDataTable,用于将List转为DataTable。其中,泛型参数T表示转换的类型,使用了Nullable.GetUnderlyingType()方法来获取可为null的基础类型。

所有属性都被添加到数据表的列中,然后将属性值插入到数据行中。

使用方法:

var list = new List<Student>
{
    new Student { Name = "Tom", Age = 18 },
    new Student { Name = "Jerry", Age = 20 }
};
var dataTable = ListToDataTable(list);

上述代码中我们首先创建了一个包含两个学生实例的列表。接着调用我们的静态方法,将List转为DataTable。最终我们得到了一个包含两条记录的数据表。

2.2 使用反射自动映射

public static DataTable ListToDataTable<T>(List<T> list)
{
    var dataTable = new DataTable();
    if (list == null || !list.Any()) return dataTable;
    var properties = typeof(T).GetProperties();
    foreach (var property in properties)
    {
        dataTable.Columns.Add(property.Name, Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType);
    }
    foreach (var item in list)
    {
        var dataRow = dataTable.NewRow();
        foreach (var property in properties)
            dataRow[property.Name] = property.GetValue(item) ?? DBNull.Value;
        dataTable.Rows.Add(dataRow);
    }
    return dataTable;
}

这段代码使用了反射技术,通过获取泛型参数T的属性信息,自动将List的每个元素映射到数据表中。

同样的,我们省略了类型转换的过程,实践中需要根据具体情况添加相关代码逻辑。

使用方法:

var list = new List<Student>
{
    new Student { Name = "Tom", Age = 18 },
    new Student { Name = "Jerry", Age = 20 }
};
var dataTable = ListToDataTable(list);

同样是通过静态方法调用,我们实现了List到DataTable的迁移。

以上就是"C#中DataTable和List互转的示例代码"的完整攻略,其中介绍了具体实现的两种方式,包括了示例代码以及使用方法的详细介绍。希望可以对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中DataTable和List互转的示例代码 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • .NET Core控制台应用程序如何使用异步(Async)Main方法详解

    下面我就为你详细讲解“.NETCore控制台应用程序如何使用异步(Async)Main方法”的完整攻略。 什么是异步(Async)Main方法 在.NET 5中,我们可以使用异步(async)修饰控制台应用程序的Main方法,使得我们可以在控制台应用程序中使用异步编程的方式。异步Main方法是一个Task<int>类型的方法,它返回一个整数作为退…

    C# 2023年5月15日
    00
  • js内存泄露的几种情况详细探讨

    JS内存泄露的几种情况详细探讨 什么是内存泄露 内存泄漏指的是一个无用的对象仍然存在于内存中,因此该对象占用的内存无法被回收。在一个长时间运行的应用程序中,内存泄漏可能会导致内存耗尽并导致应用程序崩溃。 在JS中,有很多常见的情况会导致内存泄漏,下面将详细探讨几种情况。 几种常见的内存泄露情况 1. 意外的全局变量 意外的全局变量可能是最常见的内存泄漏场景。…

    C# 2023年6月7日
    00
  • 体验.NET与文件存储服务MinIO

    对象文件存储服务(OSS)主要用于存储零散的文件,和直接存储到本地文件系统中相比,有以下的几个优势: 跨服务器可用 兼容Amazon S3 API 横向扩容 高可用 支持加密 MinIO就是一个高性能的文件服务,我们使用.NET来操作一下。 部署MinIO 最简单的办法,就是在Docker上运行MinIO。可以使用以下命令启动MinIO: docker ru…

    C# 2023年4月19日
    00
  • C#验证用户输入信息是否包含危险字符串的方法

    当用户提交输入信息时,应该进行对输入信息进行过滤,排除包含有恶意的、危险的字符串,避免安全问题的发生。本文将详细讲解 C# 验证用户输入信息是否包含危险字符串的方法。 步骤1:安装 Microsoft.Security.Application 库 Microsoft.Security.Application 是一个 .Net FrameWork 库,提供了一…

    C# 2023年5月15日
    00
  • centos7系统下搭建docker本地镜像仓库的方法

    CentOS 7系统下搭建Docker本地镜像仓库的方法 Docker 是一种流行的容器化技术,可以帮助开发人员快速构建、测试和部署应用程序。在使用 Docker 时,通常需要使用 Docker 镜像仓库来存储和管理镜像。本攻略将介绍如何在 CentOS 7 系统下搭建 Docker 本地镜像仓库。 搭建步骤 以下是在 CentOS 7 系统下搭建 Dock…

    C# 2023年5月17日
    00
  • C#实现根据实体类自动创建数据库表

    下面是 “C#实现根据实体类自动创建数据库表” 的完整攻略: 1. 实现方式 C#语言使用ORM框架可以方便地实现这个功能,其中EF (Entity Framework) 是比较常用的ORM框架之一,其核心功能是将数据库表映射到实体类上,从而实现面向对象的操作。 具体实现方式如下: 首先,需要定义一个实体类,用于描述需要存储到数据库中的实体属性。 示例: p…

    C# 2023年6月1日
    00
  • 磊科路由器智能QoS配置步骤分享

    磊科路由器智能QoS是一种网络质量服务,可以帮助您优化网络带宽,提高网络性能。本攻略将深入探讨如何配置磊科路由器智能QoS,并提供两个示例说明。 配置磊科路由器智能QoS 配置磊科路由器智能QoS的步骤如下: 1. 登录路由器管理界面 首先,您需要登录到磊科路由器的管理界面。在浏览器中输入路由器的IP地址,然后输入用户名和密码进行登录。 2. 打开QoS设置…

    C# 2023年5月17日
    00
  • 浅析C# 结构体struct

    接下来我将为您详细讲解“浅析C#结构体struct”的完整攻略。 什么是结构体struct C#中结构体(struct)是一种用户自定义类型,它与类class类似,可以包含字段、属性、方法等成员,但有一些区别。结构体是一个值类型,它们的实例通常分配在堆栈上并以此方式处理比引用类型更快。另外,结构体可以被作为参数和返回值传递。 如何定义结构体struct 定义…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部