从smallint转换为Int32时无效的强制转换异常?

时间:2018-01-10 09:39:47

标签: c# asp.net system.reflection

下面的代码从DataReader填充了我的模型的属性。我创建了一些属性Nullable,从那时起它就无法运行。

foreach (var property in _properties)
{
    property.SetValue(model, null, null);

    if (columnsInDataReader.Contains(property.Name.ToLower()))
    {
        if (!(_dataReader[property.Name] == DBNull.Value))
            property.SetValue(model, _dataReader[property.Name]);
    }
}

该属性为Int32?,数据库列为smallint,转换失败。

1 个答案:

答案 0 :(得分:2)

即使从shortint?的{​​{3}}确实存在,此处出现的问题还在于数据阅读器返回装箱 {{1你需要一个implicit conversion。在此特定情况下,转化是从short到值类型(object)。

与您的情况相符的段落是引用部分的最后一段:因为返回的对象是一个装箱int?而不是装箱short,所以演员阵容失败。

作为一个具体的例子,比较这两个片段:

int

当第一个成功时,第二个抛出short src = 42; int? dst = (int?)src; object src = (short)42; int? dst = (int?)src;

在您的情况下,不会发生显式转换,但是对InvalidCastException的调用会应用类似的转换规则,因此会失败。

总结一下,为了使调用成功,您必须从提取的对象的类型中选择可在运行时强制转换的属性类型,例如SetValueshort