C# 使用类型为'的反射对象从wcf转换数据;System.Int64';无法转换为类型';System.Int32';

C# 使用类型为'的反射对象从wcf转换数据;System.Int64';无法转换为类型';System.Int32';,c#,json,wcf,reflection,int,C#,Json,Wcf,Reflection,Int,我正在从wcf函数WebMessageFormat=Json检索一个datatable,然后使用反射设置数据协定的属性。我在一个int字段上得到以下错误- “System.Int64”类型的对象无法转换为“System.Int32”类型 有人能解释一下这是什么以及如何处理吗?在强制转换盒式值类型值时,必须强制转换为正确的类型。例如: var myLong = (object)42L; var intValue = (int)myLong; // WRONG - myLong is a boxe

我正在从wcf函数WebMessageFormat=Json检索一个datatable,然后使用反射设置数据协定的属性。我在一个int字段上得到以下错误-

“System.Int64”类型的对象无法转换为“System.Int32”类型


有人能解释一下这是什么以及如何处理吗?

在强制转换盒式值类型值时,必须强制转换为正确的类型。例如:

var myLong = (object)42L;

var intValue = (int)myLong; // WRONG - myLong is a boxed long, not int
var intValue2 = (int)(long)myLong; // CORRECT - myLong is unboxed first, then converted

请注意,如果
int
不够大,无法包含
long
值,即使您正确取消了值的装箱,也可能会得到
OverflowException

当然。。。不能将64位整数放入32位整数中。没有足够的空间来表示该值。Int64的最大值是9223372036854775807,而Int32的最大值要小得多-2147483647这是否意味着与所有其他字段不同,如果字段是int,我总是需要先从long转换?所以对于所有字段,我可以只使用var value=row.Field(property.Name);property.SetValue(契约,值!=DBNull.value?值:null,null);但现在我需要先检查字段类型?有什么办法可以解决这个问题吗?@MikeTurner如果字段是值类型,则需要始终转换为完全相同的类型,即它实现的接口之一或
对象(不是100%正确,但在大多数情况下足够接近)。无论是
int
还是
DBNull
,都不重要,但两边必须是相同的类型-将装箱的
int
强制转换为
long
与使用例如
DBNull
这样做没有区别
dynamic
允许您避免显式类型检查(
(int)(dynamic)(object)value
(int)value
执行时将起作用),但可能会产生其他后果-确保您了解
dynamic
在执行该操作时的工作方式。奇怪的是,我以前返回过int,从未遇到过此问题,有没有办法让我的wcf函数返回int32而不是int64?我不明白为什么现在我在函数中添加了一个int字段时突然出现了这个问题?@MikeTurner你没有显示足够的代码来回答这个问题。请注意,JSON没有
int
(或者说
long
),所有的JSON数字都更像是C#的
decimal
。谢谢你的帮助!windows函数是否返回非int32值。。。