C# DataTable 转换为实体类对象实例
在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步:定义反射转换函数
核心逻辑如下:
- 确定类型:使用
typeof(T)获取目标实体类型。 - 初始化列表:创建
List<T>用于存储转换后的对象。 - 遍历数据行:循环处理
dt.Rows中的每一行数据。 - 属性匹配与赋值:获取实体所有属性,检查属性名是否与列名匹配,并进行类型转换后赋值。
复制代码 代码如下:
private static List<T> TableToEntity<T>(DataTable dt) where T : class, new()
{
Type type = typeof(T);
List<T> list = new List<T>();
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# 数据层映射的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









