2012-12-17 67 views
4

我有什麼實際上是自定義消息協議的反序列化類。該類使用反射來檢查類的屬性和協議映射的屬性。這是工作正常,除非值是一個無符號整數(32或64)並被轉換爲一個整數(32或64)。Convert.ChangeType可以在未經檢查的環境中運行嗎?

我可以測試(例如if x is int)的屬性類型和分支,這些數字類型在unchecked塊進行類型轉換的代碼,但我寧願保持代碼的簡單,找到一種方法,使用現有的Convert.ChangeType(value, convertToType)邏輯。有沒有辦法讓這個轉換器忽略數字溢出?還是有一種替代方法只使用運行時已知的類型進行投射?

注意:我知道這裏有一個根本原因需要修復,但我們目前沒有能力更改數據源,傳輸類型或消息傳遞協議。

+0

我們在討論什麼版本的框架? –

+0

你是否期待在你的應用程序中'uint'的值不會大於'int.MaxValue'? –

+0

不是我知道的..但是你試圖把它抽象出來會得到什麼?我會說你失去了看到發生什麼事的時候你真的應該知道的能力。 –

回答

1

我想這是一個開發者的本能,不想打開is關鍵字,一直在那裏。無論如何,我會建議你這樣做。如果你不使用反射,我會理解引入它的商議,但如果你已經在使用反射...

如果你知道(或猜測)uint不會大於int.MaxValue,那麼你可以使用Convert.ToInt32。以防萬一,您還應該捕獲「OverflowExceptions」。

+0

值肯定可以大於int.MaxValue。如果我知道需要在編譯時處理的所有不同類型,我可能會將其吸收並打開「is」,但我甚至不知道傳入值是否爲數字。 – JRoughan

+0

如果該值可能大於「int.MaxValue」,那麼int不是將其存儲在您的末尾的正確方法。 –

+0

只是一個觀察:你的情況似乎很複雜,開始。有時候你必須變得富有創造力(和骯髒)來處理遺留代碼。 –

相關問題