C# PropertyInfo.GetValue返回int,但强制转换为十进制将导致InvalidCastException
下面的代码产生了一个意外的结果(可能是因为我们不了解这里发生的一些基本情况)C# PropertyInfo.GetValue返回int,但强制转换为十进制将导致InvalidCastException,c#,.net,C#,.net,下面的代码产生了一个意外的结果(可能是因为我们不了解这里发生的一些基本情况) 有人能解释一下这里发生了什么以及如何修复这个代码吗?在任何情况下,我们都希望得到十进制值,即使它是0。您需要首先取消对int的装箱,然后才能将其转换为十进制值 var propInfo = propObj.GetType().GetProperty(prop.PropertyName); var valueInt = (int)propInfo.GetValue(obj); /* valueobj now contai
有人能解释一下这里发生了什么以及如何修复这个代码吗?在任何情况下,我们都希望得到十进制值,即使它是0。您需要首先取消对int的装箱,然后才能将其转换为十进制值
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之间的转换实际上是一个取消装箱操作,如果您尝试将object转换为decimal,它将尝试取消装箱一个decimal,因此失败
内部构件
如果我们在生成的IL中查找问题中的版本和上面的版本,我们可以更清楚地看到差异:
对于原始版本,这是转换为十进制生成的结果:
unbox.any [mscorlib]System.Decimal
对于上述版本:
call valuetype [mscorlib]System.Decimal [mscorlib]System.Decimal::op_Implicit(int32)
它也可以在一行中完成:
(decimal)(int)propInfo.GetValue(obj)
,尽管可以说它不像这样清晰。@GabrielNegut是的,你是对的,它也可以像那样清晰,但我认为分开行更清晰
call valuetype [mscorlib]System.Decimal [mscorlib]System.Decimal::op_Implicit(int32)