2

我正在使用在此站点上找到的通用 DataTable 到 List 转换方法:

private List<T> ConvertToList<T>(DataTable dt)
        {
            var columnNames = dt.Columns.Cast<DataColumn>()
                .Select(c => c.ColumnName)
                .ToList();

            var properties = typeof(T).GetProperties();

            return dt.AsEnumerable().Select(row =>
            {
                var objT = Activator.CreateInstance<T>();

                foreach (var pro in properties)
                {
                    if (columnNames.Contains(pro.Name))
                    {
                            pro.SetValue(objT, row[pro.Name], null);
                    }
                }

                return objT;
            }).ToList();

        }

它工作得很好,除非我在 pro.SetValue 中为整数字段命中空值。它失败的原因是,如果第二个参数为 null,pro.SetValue 将为一个类型设置默认值,如下所示:pro.SetValue(objT, null,null)。但我的 row[IdColumn] 返回空对象 {} 而不是 null。我得到的错误是:

“System.DBNull”类型的对象无法转换为“System.Nullable`1[System.Int32]”类型。

使用时int?

'System.DBNull' 类型的对象无法转换为 [System.Int32]' 类型。

使用时int 如何处理这种情况?

4

2 回答 2

5

首先检查null:

pro.SetValue(objT, row.IsNull(pro.Name) ? null : row[pro.Name], null);
于 2012-10-12T21:13:58.233 回答
1

您可能需要明确检查 DBNull

if (columnNames.Contains(pro.Name))
{
    if (row.IsNull(pro.Name))
        pro.SetValue(objT, null, null);
    else
        pro.SetValue(objT, row[pro.Name], null);
}

这将处理int?,但尝试转换nullInt32(不可为空)应该是错误情况。

于 2012-10-12T21:15:01.253 回答