Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# PropertyInfo.GetValue返回int,但强制转换为十进制将导致InvalidCastException_C#_.net - Fatal编程技术网

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)