You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

错误原因

  1. 变量名笔误:代码里的objT是未定义变量,实际应该用创建好的objT1
  2. 可空类型转换逻辑缺失: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 01:31:00