DataTable转List泛型方法可空Decimal字段空值转换报错求助
修复DataTable转List时Nullable字段的类型转换错误
你当前的泛型转换方法在处理decimal?这类可空值类型时出错,报错信息为:
Invalid cast from 'System.Decimal' to 'System.Nullable`1[[System.Decimal, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral
错误原因
- 变量名笔误:代码里的
objT是未定义变量,实际应该用创建好的objT1 - 可空类型转换逻辑缺失:
Convert.ChangeType无法直接将decimal值转换为decimal?类型,因为Nullable<T>是泛型结构,需要先获取其底层的实际值类型(即decimal),转换完成后再自动装箱为Nullable<decimal>。
修复后的完整代码
public static List<T> ConvertToList1<T>(DataTable dt) { var columnNames = dt.Columns.Cast<DataColumn>() .Select(c => c.ColumnName) .ToList(); var properties = typeof(T).GetProperties(); return dt.AsEnumerable().Select(row => { T objT1 = Activator.CreateInstance<T>(); foreach (var pro in properties) { if (columnNames.Contains(pro.Name)) { var cellValue = row[pro.Name]; var propertyType = pro.PropertyType; if (cellValue == DBNull.Value) { pro.SetValue(objT1, null); } else { // 处理可空类型:获取其底层的实际值类型 var targetType = Nullable.GetUnderlyingType(propertyType) ?? propertyType; // 转换为目标类型后赋值 var convertedValue = Convert.ChangeType(cellValue, targetType); pro.SetValue(objT1, convertedValue); } } } return objT1; }).ToList(); }
关键修复点
- 修正了原代码中未定义的
objT变量问题,统一使用创建好的objT1 - 新增可空类型判断逻辑,通过
Nullable.GetUnderlyingType提取可空类型的底层实际类型,再执行转换 - 拆分空值与非空值的处理分支,代码逻辑更清晰
内容的提问来源于stack exchange,提问作者TechChoice
相关产品推荐
相关产品推荐

