PropertyInfo.GetValue返回int,但是转换为十进制会导致InvalidCastException

时间:2017-09-12 08:33:51

标签: c# .net

我们有以下代码会产生意外结果(可能是因为我们不理解这里发生的一些基本原因)。

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。

1 个答案:

答案 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)