C# DataTable 转换为实体类对象实例

阿澈
阿澈
发布时间:2026-10-15 | 4人浏览过
原创

在C#开发中,将数据库查询结果DataTable转换为强类型的实体类List<T>是常见需求。本文分享一种基于反射的通用转换方法,通过属性名匹配自动填充数据,避免逐字段手动赋值的繁琐。

实体类定义与场景

假设我们需要处理一个用户表,首先定义对应的实体类User,包含ID和Name两个属性:

public class User
{
    public int ID { get; set; }
    public string Name { get; set; }
}

当数据源为DataTable时,通常需要根据列名将每一行的值映射到实体的对应属性上。

通用转换方法实现

利用反射System.Reflection,我们可以编写一个静态泛型方法TableToEntity。该方法遍历DataTable的所有行,并通过PropertyInfo获取实体类的属性信息,进行动态赋值。

第1步:定义反射转换函数

核心逻辑如下:

  1. 确定类型:使用typeof(T)获取目标实体类型。
  2. 初始化列表:创建List<T>用于存储转换后的对象。
  3. 遍历数据行:循环处理dt.Rows中的每一行数据。
  4. 属性匹配与赋值:获取实体所有属性,检查属性名是否与列名匹配,并进行类型转换后赋值。
复制代码 代码如下:
private static List<T> TableToEntity<T>(DataTable dt) where T : class, new()
{
    Type type = typeof(T);
    List<T> list = new List<T&gt();

    foreach (DataRow row in dt.Rows)
    {
        PropertyInfo[] pArray = type.GetProperties();
        T entity = new T();

        foreach (PropertyInfo p in pArray)
        {
            // 防止列名为空或属性未找到
            if (row[p.Name] != DBNull.Value)
            {
                object value = row[p.Name];

                // 处理Int64转为Int32的情况,适应常见的ID字段
                if (value is Int64)
                {
                    p.SetValue(entity, Convert.ToInt32(value), null);
                }
                else
                {
                    p.SetValue(entity, value, null);
                }
            }
        }
        list.Add(entity);
    }
    return list;
}

注意: 1. 约束 where T : class, new() 确保实体类无参且为引用类型。 2. 代码中增加了 DBNull.Value 判断,防止数据库空值导致反射报错。 3. 针对部分数据库返回的 Int64 主键,增加了转 Int32 的逻辑以适应常见 int 类型属性。

第2步:调用转换方法

在使用时,只需传入获取到的 DataTable 即可得到 List<User>:

List<User> userList = TableToEntity<User>(YourDataTable);

完成判断

当 userList 不为空且包含正确数量的对象,且每个对象的属性值与原 DataTable 对应列值一致时,即表示转换成功。

简要总结

上述就是 C# 利用反射将 DataTable 转换为实体类对象实例的详细内容,更多关于 C# 数据层映射的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表