【问题标题】:Converting data from wcf using reflection Object of type 'System.Int64' cannot be converted to type 'System.Int32'使用“System.Int64”类型的反射对象从 wcf 转换数据无法转换为“System.Int32”类型
【发布时间】:2023-03-06 06:25:01
【问题描述】:

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

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

谁能解释这是什么以及如何解决?

【问题讨论】:

  • 当然...您不能将 64 位整数放入 32 位整数中。没有足够的空间来表达价值。 Int64 的最大值是 9,223,372,036,854,775,807,而 Int32 的最大值要小得多 - 2,147,483,647

标签: c# json wcf reflection int


【解决方案1】:

当转换装箱的值类型值时,您必须转换为正确的类型。例如:

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

【讨论】:

  • 这是否意味着与所有其他字段不同,如果该字段是int,我总是需要先从long转换?所以对于所有字段,我可以 var value = row.Field(property.Name); property.SetValue(contract, value != DBNull.Value ? value : null, null);但现在我需要先检查字段类型?有没有办法解决这个问题?
  • @MikeTurner 如果该字段是值类型,您需要始终转换为完全相同的类型,即它实现的接口之一或object(不是 100% 正确,但足够接近大多数用途)。不管是int 还是DBNull,但双方必须是相同的类型 - 将一个装箱的int 转换为long 和对例如做同样的事情没有区别。 DBNulldynamic 允许您避免显式类型检查((int)(dynamic)(object)value 将在 (int)value 这样做时起作用),但可能会产生其他后果 - 如果您走这条路,请确保您了解 dynamic 的工作原理。
  • 奇怪的是我以前返回过整数并且从未遇到过这个问题,有没有办法让我的 wcf 函数返回 int32 而不是 int64?我很困惑为什么当我在我的函数中添加一个 int 字段时突然弹出这个?
  • @MikeTurner 你没有展示足够的代码来回答这个问题。请注意,JSON 没有 int(或 long,就此而言) - 所有 JSON 数字都更像 C# 的 decimal
  • 其实,我想通了。感谢您的帮助!是一个返回非 int32 值的 windows 函数...
猜你喜欢
  • 1970-01-01
  • 2017-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
相关资源
最近更新 更多