下面的代码从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
,转换失败。
答案 0 :(得分:2)
即使从short
到int?
的{{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
的调用会应用类似的转换规则,因此会失败。
总结一下,为了使调用成功,您必须从提取的对象的类型中选择可在运行时强制转换的属性类型,例如SetValue
和short