C#中DataTable转List推荐反射通用法:属性名与列名不区分大小写匹配,自动处理基础类型及可空类型,跳过不匹配列和DBNull值;LINQ法简洁但需手动处理类型转换和DBNull。

在C#中,将 DataTable 转换为泛型 List<t></t> 是常见需求,核心思路是:**通过反射获取目标类型 T 的属性,逐行读取 DataTable 的数据并映射赋值**。关键在于字段名与属性名的匹配、类型转换的安全处理,以及性能优化。
这是最常用、可复用的方式,适合大多数自定义实体类:
ColumnName)完全一致(不区分大小写更稳妥)示例代码:
public static List<T> ToList<T>(DataTable dt) where T : new()
{
var list = new List<T>();
var properties = typeof(T).GetProperties().ToDictionary(p => p.Name, StringComparer.OrdinalIgnoreCase);
<pre class="brush:php;toolbar:false;">foreach (DataRow row in dt.Rows)
{
var obj = new T();
foreach (var prop in properties.Values)
{
if (dt.Columns.Contains(prop.Name) && row[prop.Name] != DBNull.Value)
{
try
{
var value = Convert.ChangeType(row[prop.Name], prop.PropertyType);
prop.SetValue(obj, value);
}
catch { /* 类型不兼容时跳过该字段 */ }
}
}
list.Add(obj);
}
return list;}
调用方式:var users = ToList<user>(dataTable);</user>
如果 DataTable 结构固定、实体简单,可用更简洁的 LINQ 写法:
System.Data.DataSetExtensions(需引用对应 NuGet 包或框架内置)示例:
var list = dataTable.AsEnumerable()
.Select(row => new User
{
Id = row.Field<int>("Id"),
Name = row.Field<string>("Name"),
BirthDate = row.Field<DateTime?>("BirthDate")
}).ToList();实际使用中容易出错的点:
StringComparer.OrdinalIgnoreCase 或统一转小写比对row[colName] != DBNull.Value,否则 Convert.ChangeType 会抛异常int?,要确保源值为 null 或能转为目标基础类型,Field<t>()</t> 方法内部已处理大数据量时可提升效率:
PropertyInfo[] 和列索引(如 dt.Columns.IndexOf("Name")),避免每次循环重复查找foreach (DataRow row in dt.Rows) 比 for (int i = 0; i 更高效(DataTable 内部做了优化)
基本上就这些。选反射通用版还是 LINQ 简洁版,取决于你的项目规范、数据稳定性和维护成本。不复杂但容易忽略细节,尤其在跨数据库或历史数据迁移场景下。
以上就是C#怎么将DataTable转换为List C#数据表转泛型列表方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号