c# datatable 通过反射转成泛型list

在C#中,可以使用反射来将DataTable转换为泛型列表。下面是一个示例代码,展示了如何使用反射来实现这个转换过程:

csharp 复制代码
using System;
using System.Collections.Generic;
using System.Data;

public class DataConverter
{
    public List<T> ConvertDataTableToList<T>(DataTable dataTable) where T : new()
    {
        List<T> list = new List<T>();

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

            foreach (DataColumn column in dataTable.Columns)
            {
                var property = typeof(T).GetProperty(column.ColumnName);
                if (property != null && row[column] != DBNull.Value)
                {
                    property.SetValue(item, Convert.ChangeType(row[column], property.PropertyType), null);
                }
            }

            list.Add(item);
        }

        return list;
    }
}

在这个示例中,我们创建了一个名为DataConverter的类,其中包含一个泛型方法ConvertDataTableToList<T>。这个方法接收一个DataTable作为参数,并使用反射技术将其转换为指定类型的泛型列表。在方法中,我们使用foreach循环遍历DataTable的行和列,然后使用反射来动态设置对象的属性值。

使用这个DataConverter类,可以很容易地将DataTable转换为任何指定类型的泛型列表。例如,假设我们有一个名为Person的实体类:

csharp 复制代码
public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

可以这样使用DataConverter类来将DataTable转换为List<Person>:

csharp 复制代码
 // 创建一个DataTable实例
 DataTable dataTable = new DataTable("Person");

 // 添加列
 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, "Alice", 30);
 dataTable.Rows.Add(3, "Bob", 28);

 List<Person> personList = ConvertDataTableToList<Person>(dataTable);

在上面的示例中,我们根据Person类的属性结构,将DataTable中的数据转换为List<Person>。这种方法能够以通用的方式来转换任何实体类对应的DataTable为泛型列表,使代码更加灵活和可复用。

相关推荐
Behavior6 小时前
Unity 7.0 Alpha 拆解:编辑器干掉 Mono 换 CoreCLR
c#·unity3d·游戏开发
淡海水6 小时前
02-06-原理篇-增量式GC与并发GC
算法·unity·c#·并发·gc·增量
Vertira7 小时前
C# 函数封装成 DLL,
开发语言·c#
浅尝辄止;8 小时前
设计模式在HIS/LIS医疗系统中的完整实践指南(C#版)
开发语言·设计模式·c#
kimloner18 小时前
开源一个 376KB 的 Windows 桌面小工具:便签 + 截图标注 + OCR + 待办提醒(C# / WinForms)
windows·开源·c#·ocr·winforms
阿松爱学习19 小时前
【Unity开发】Aspose.PDF的使用
unity·pdf·c#
半亩码田19 小时前
C#转Python第4.8篇:正则表达式:Python re 模块 vs C# System.Text.RegularExpressions
python·正则表达式·c#
FPGA小徐20 小时前
【一生一芯 / PA】异常响应机制:RISC-V 中 ecall → mtvec → mret 的完整代
开发语言·数据库·c#
无忧.芙桃20 小时前
C++语言原理与实践(十二):list类的底层实现
c++·windows·list
淡海水20 小时前
02-04-原理篇-GC Roots与对象图遍历
算法·unity·c#·图·gc·遍历·roots