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

在C#中,将 DataTable 转换为泛型 List<t></t> 是常见需求,核心思路是:**通过反射获取目标类型 T 的属性,逐行读取 DataTable 的数据并映射赋值**。关键在于字段名与属性名的匹配、类型转换的安全处理,以及性能优化。
使用反射 + 泛型方法(推荐,通用性强)
这是最常用、可复用的方式,适合大多数自定义实体类:
- 要求实体类属性名与 DataTable 列名(
ColumnName)完全一致(不区分大小写更稳妥) - 自动处理基础类型(int、string、DateTime 等)和可空类型(int?、DateTime?)
- 跳过不匹配的列或无法转换的值,避免运行时异常
示例代码:
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>
使用 LINQ + DataRowExtensions(.NET Framework 3.5+ / .NET Core 3.0+)
如果 DataTable 结构固定、实体简单,可用更简洁的 LINQ 写法:
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~