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日

相关文章

  • Web前端面试笔试题总结

    Web前端面试笔试题总结 在Web前端开发中,面试和笔试是非常重要的环节。本文将总结一些常见的Web前端面试和笔试题,并提供相应的解答。 HTML相关 什么是HTML?HTML5有哪些新特性? HTML是一种标记语言,用于创建Web页面。HTML5是HTML的最新版本,具有以下新特性: 新的语义元素,如header、footer、nav、article、se…

    C# 2023年5月15日
    00
  • C# 泛型数组学习小结

    C# 泛型数组学习小结 简介 在C#中,可以使用数组来存储同一类型的多个元素。但是,当你要在数组中存储不同类型的元素时,就需要使用泛型数组。本篇文章将简要介绍如何创建和使用C#泛型数组。 声明泛型数组 要声明一个泛型数组,需要在变量类型后面跟一个尖括号和一个泛型类型。例如,下面的代码创建了一个类型为List<string>的泛型数组。 List&…

    C# 2023年6月6日
    00
  • .NET  Visual Studio 代码性能分析工具

    下面是关于“.NET Visual Studio代码性能分析工具”的完整攻略,包含两个示例。 1. Visual Studio代码性能分析工具简介 Visual Studio代码性能分析工具是一种用于分析和优化.NET应用程序性能的工具。它可以帮助开发人员识别和解决应用程序中的性能问题,例如内存泄漏、高CPU使用率和长时间的响应时间等。 2. 使用Visua…

    C# 2023年5月15日
    00
  • C#中如何限制TextBox控件内输入值的范围

    以下是C#中如何限制TextBox控件内输入值的范围的详细攻略: 步骤一:创建一个TextBox控件 首先,我们需要在我们的窗体上创建一个TextBox控件。这可以通过拖动和放置窗体设计器上的文本框控件来完成,或者通过以下代码创建: TextBox textBox1 = new TextBox(); this.Controls.Add(textBox1); …

    C# 2023年6月6日
    00
  • 在C# 8中如何使用默认接口方法详解

    当在一个现有的接口中添加新的成员时,会面临着兼容性问题,因为所有使用该接口的实现类都需要进行相应的修改。针对这种情况,C# 8推出了接口的默认实现方法的特性。通过默认实现方法,接口的作者可以为接口提供新功能,而无需破坏面向对象设计中的接口整体抽象性原则。 一、默认接口方法的定义 默认接口方法的定义与普通接口方法一致,不同的在于将其实现体嵌入在接口定义之中,并…

    C# 2023年6月6日
    00
  • 基于c# Task自己动手写个异步IO函数

    下面就来详细讲解“基于c# Task自己动手写个异步IO函数”的攻略。 1. 了解异步IO 异步IO(Asynchronous IO)是指用户空间应用程序在发起IO请求后立即返回控制权给操作系统,并且不需要等待IO操作完成,而是通过回调函数或者等待通知的方式来获取IO完成的结果。 相对于同步IO(Synchronous IO),异步IO能够充分利用计算机的多…

    C# 2023年5月15日
    00
  • asp.net 无重复随机数代码

    针对“asp.net 无重复随机数代码”的问题,下面我介绍一下这个问题的解决思路和具体实现过程: 解决思路 实现无重复随机数,需要考虑两个方面: 随机数不能重复,需要做到去重。 生成的随机数需要随机分布,不能出现指定的规律。 基于这两个需求,我们可以采用以下思路来解决问题: 定义一个范围内的数组,用于存储随机数。 定义一个随机数生成器,用于生成指定范围内的随…

    C# 2023年5月31日
    00
  • ASP.NET配置文件Web.config用法详解

    我来详细讲解一下ASP.NET配置文件Web.config用法的攻略。 什么是Web.config配置文件 Web.config是ASP.NET的配置文件,用于设置应用程序级别的配置信息。它可以定义应用程序的全局设置、连接字符串、安全性、错误标识和其他功能。在ASP.NET的开发中,Web.config文件是非常常见且重要的文件,因为其中定义了很多应用程序的…

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