获取类型的默认值

时间:2012-10-12 21:11:51

标签: c# .net reflection

我使用的是我在本网站上找到的通用DataTable to 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)。 但我的行[IdColumn]返回空对象{}而不是null。 我得到的错误是:

  

类型的对象&#39; System.DBNull&#39;无法转换为类型   &#39; System.Nullable`1 [System.Int32]&#39;

使用int?时 和

  

类型的对象&#39; System.DBNull&#39;无法转换为类型   [System.Int32]&#39;

使用int时 我该如何处理这个案子?

2 个答案:

答案 0 :(得分:5)

首先检查null:

pro.SetValue(objT, row.IsNull(pro.Name) ? null : row[pro.Name], null);

答案 1 :(得分: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?,但尝试将null转换为Int32(不可为空) 应该是错误案例。

相关问题