C# 获取类型的默认值

C# 获取类型的默认值,c#,.net,reflection,C#,.net,Reflection,我正在使用一个通用DataTable来列出我在本网站上找到的转换方法: private List<T> ConvertToList<T>(DataTable dt) { var columnNames = dt.Columns.Cast<DataColumn>() .Select(c => c.ColumnName) .ToList();

我正在使用一个通用DataTable来列出我在本网站上找到的转换方法:

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();

        }
私有列表转换器列表(数据表dt)
{
var columnNames=dt.Columns.Cast()
.选择(c=>c.ColumnName)
.ToList();
var properties=typeof(T).GetProperties();
返回dt.AsEnumerable().Select(行=>
{
var objT=Activator.CreateInstance();
foreach(属性中的var pro)
{
if(columnNames.Contains(pro.Name))
{
pro.SetValue(对象,行[pro.Name],空);
}
}
返回objT;
}).ToList();
}
它工作得很好,除非我在pro.SetValue中为整型字段输入空值。它失败的原因是,如果第二个参数为null,则pro.SetValue将为类型设置默认值,如下所示:pro.SetValue(objT,null,null)。 但是我的行[IdColumn]返回空对象{},而不是null。 我得到的错误是:

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

使用
int时?

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

使用
int
如何处理此情况?

首先检查空值:

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

您可能需要显式地检查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
(不可为null)应该是一种错误情况