我们有以下代码会产生意外结果(可能是因为我们不理解这里发生的一些基本原因)。
var propInfo = propObj.GetType().GetProperty(prop.PropertyName);
var valueobj = propInfo.GetValue(obj); /* valueobj now contains the number 0*/
var valueDecimal = (decimal) valueobj; /* this produces an InvalidCastException
任何人都可以解释这里发生了什么以及如何修复此代码?在任何情况下,我们都想获得十进制值,即使它是0。
答案 0 :(得分:3)
您需要先取消装箱,然后将其转换为十进制
var propInfo = propObj.GetType().GetProperty(prop.PropertyName);
var valueInt = (int)propInfo.GetValue(obj); /* valueobj now contains the number 0*/
var valueDecimal = (decimal) valueInt;
虽然语法相同,但object和int之间的转换实际上是一个拆箱操作,如果你试图将对象转换为十进制,它会尝试取消装箱小数,从而失败。
<强>塔内强>
如果我们查看生成的IL中的问题版本和上面的版本,我们可以更清楚地看到差异:
对于原始,这是十进制生成的:
unbox.any [mscorlib]System.Decimal
对于上面的版本:
call valuetype [mscorlib]System.Decimal [mscorlib]System.Decimal::op_Implicit(int32)