2010-01-04 121 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