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它将编译,但在问题的场景中,您没有关于目标类型的编译时信息,甚至直接强制转换也不够。但是,应该发出一个动态生成的方法,根据需要取消绑定和强制转换。。。没有什么是不可能的,但非常烦人和脆弱。