2010-01-04 67 views
3

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

来自异常的文字是;

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。

我们该如何克服这个例外?

编辑:此问题与DevExpress XtraGrid“格式条件”正在绑定到我们的自定义数据类型“钱”的列上进行评估。货币类型可以绑定到没有问题的列,它当正在对列进行评价的格式条件仅提出一个InvalidCastException,即GridColumnValue> 0

+5

您是否真的将“Money”类型定义为“System”命名空间中的异常文本? – 2010-01-04 04:26:51

+0

是的,我们做。 System.Money – Roboudy 2010-01-04 04:28:12

+0

重新评论(我的文章),我认为你需要更新问题和标签;这些问题对这个问题至关重要。我不想编辑自己,因为我不熟悉这些工具。 – 2010-01-04 07:07:22

回答

2

这听起来像问题是这里是intint转换Money,因为它不知道这件事(但Money可能可转换为int)。

通过代码(反射器)一眼,没有明显的方式,Convert.ChangeType有史以来会喜欢这种用法。

我会想知道你所使用的网格组件,并且其中int是从哪里来的,因为通常希望它主要处理向/从string,通过与类型相关联的TypeConverter或财产(通过PropertyDescriptor.Converter)。既然听起来好像你已经写了你自己的TypeConverter,它也值得展示ConvertFrom的实现。

电网的使用,在普通的C#,你应该能够做到这一点仅仅通过定义静态转换操作符(implicit/explicit)。

+0

谢谢马克。具体来说,网格组件是DevExpress XtraGrid。我们试图根据绑定到我们的Money数据类型的列实现格式条件。例如,像“GridColumnPrice> 0”这样的表达式会引发System.Convert中的InvalidCastException异常。无论我们正在实现什么代码,即TypeConverter或IConvertible,都不会调用这些方法中的任何一种将Int32转换为Money。我们有静态转换运算符,可以使用我们的转换将Int32转换为Money,但网格组件不会调用它们。 – Roboudy 2010-01-04 05:29:04

+0

我们的TypeConverter实现用于将字符串转换为金钱和金钱。当我们更改/添加代码以检测Int32类型时,代码仍未被网格调用。 – Roboudy 2010-01-04 05:30:17

+0

所以这听起来像问题是“GridColumnPrice> 0”;如果删除它,它可以正常工作吗?你必须检查XtraGrid文档,看看它是如何工作的,因为它不是核心组件,但你可以尝试*实现'IComparable ',但我认为这有点过于乐观。 – 2010-01-04 06:10:32