C# 从smallint转换为Int32时发生无效的强制转换异常?

C# 从smallint转换为Int32时发生无效的强制转换异常?,c#,asp.net,system.reflection,C#,Asp.net,System.reflection,下面的代码从DataReader中填充了我的模型的属性。我将一些属性设置为可空,从那时起它就不起作用了 foreach (var property in _properties) { property.SetValue(model, null, null); if (columnsInDataReader.Contains(property.Name.ToLower())) { if (!(_dataReader[property.Name] == DB

下面的代码从
DataReader
中填充了我的模型的属性。我将一些属性
设置为可空
,从那时起它就不起作用了

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
,转换失败。

即使存在从
short
int?
的转换,这里的问题是因为数据读取器返回一个装箱的
short
,您需要一个。在这种特定情况下,将从
对象
转换为值类型(
int?

与您的情况相匹配的段落是引用部分的最后一段:由于返回的对象是装箱的
short
,而不是装箱的
int
,因此强制转换失败

作为一个具体示例,请比较以下两个片段:

short src = 42;
int? dst = (int?)src;

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

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


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

您将什么设置为可为null?Smallint在int的范围内。您确定这是它失败的地方吗?请更具体一些。到底是什么不起作用。请提供所有相关信息,特别是实际异常以及在何处引发的相关实例的值。@pinkfloydx33模型的某些int属性以前不可为null。@Florian Michel yes。虽然它是
int,但很难看吗?dst2=(int?)(短)src2
也将编译。@Chris它将编译,但在问题的场景中,您没有关于目标类型的编译时信息,甚至直接强制转换也不够。但是,应该发出一个动态生成的方法,根据需要取消绑定和强制转换。。。没有什么是不可能的,但非常烦人和脆弱。