【问题标题】:system.convert to custom objectsystem.convert 到自定义对象
【发布时间】:2010-01-04 04:22:58
【问题描述】:

我们有一个自定义数据类型对象“Money”,用于在我们的应用程序中表示货币值。目前我们正在尝试在网格组件中实现一些自定义格式,但是 System.Convert 引发了异常“InvalidCastException”。

异常中的文本是;

System.InvalidCastException occurred
  Message="Invalid cast from 'System.Int32' to 'System.Money'."
  Source="mscorlib"
  StackTrace: at System.Convert.DefaultToType(IConvertible value, Type targetType, IFormatProvider provider)
  InnerException:

请注意,我们的“Money”数据类型确实实现了 IConvertible 以及拥有自己的 TypeConverter。

我们如何克服这个异常?

编辑:此问题与在绑定到我们的自定义数据类型“Money”的列上评估 DevExpress XtraGrid“格式条件”有关。 Money 类型可以毫无问题地绑定到列,它仅在对列评估格式条件时引发 InvalidCastException,即 GridColumnValue > 0

【问题讨论】:

  • 您是否真的将您的“Money”类型定义为位于“System”命名空间中,如异常文本所示?
  • 回复你的评论(我的帖子),我认为你需要更新问题和标签;这些点对这个问题至关重要。我不想编辑自己,因为我对这些工具不是很熟悉。

标签: c# .net typeconverter xtragrid


【解决方案1】:

听起来问题是这里的int,而int 不是可转换to @987654323 @,因为它对此一无所知(但 Money 可能 可以转换为 int)。

浏览代码(反射器),Convert.ChangeType 没有明显的方式曾经会喜欢这种用法。

我很想知道您正在使用什么网格组件,以及 int 来自哪里,因为通常您会希望它主要与 string 进行交易,通过与类型或属性关联的TypeConverter(通过PropertyDescriptor.Converter)。由于听起来您已经编写了自己的 TypeConverter,因此也值得展示 ConvertFrom 实现。

在网格使用之外,在常规 C# 中,您应该能够简单地通过定义一个静态转换运算符 (implicit / explicit) 来做到这一点。

【讨论】:

  • 谢谢马克。具体来说,网格组件是 DevExpress XtraGrid。我们正在尝试基于绑定到我们的 Money 数据类型的列来实现格式条件。例如,诸如“GridColumnPrice > 0”之类的表达式会引发 System.Convert 中的 InvalidCastException。无论我们实现什么代码,即 TypeConverter 或 IConvertible,都没有调用这些方法来将 Int32 转换为 Money。我们有静态转换运算符,可以使用我们的转换将 Int32 转换为 Money,但网格组件不会调用它们。
  • 我们的 TypeConverter 实现用于字符串到货币和货币到字符串的转换。当我们更改/添加代码以检测 Int32 类型时,代码仍然没有被网格调用。
  • 所以听起来问题出在“GridColumnPrice > 0”;如果您删除它,它可以正常工作吗?您必须查看 XtraGrid 文档以了解其行为方式,因为它不是核心组件,但您可以尝试实现 IComparable<int>,但我认为这有点过于乐观了。
  • 没有“GridColumnPrice > 0”表达式,一切正常。只有当网格试图评估它生成 InvalidCastException 的表达式时。
  • 我们的 Money 类型也实现了 IComparable 和 IComparable。
猜你喜欢
  • 2011-04-14
  • 2012-10-10
  • 2023-04-02
  • 2012-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多