TypeConverter 是從 .NET Framework 1.1 開始就有的東西,我是在 ASP.NET MVC 的 ActionFilter 中要取得某個 RouteData 時用到這個東西,它能夠幫助我們取得某個型別的轉換器,用來將另一個型別的實例轉換成該型別,這些型別或許我們在開發時間是未知的,但是在執行時期是明確的。
我有一個 UserController,其中 Index Action 使用了 Attribute Routing 定義了路由網址,並且放置了一個 Test
ActionFilterAttribute。
在 Test ActionFilterAttribute 裡面我想要取得 userId 來做一些處理,於是我就透過 filterContext.RouteData.Values["userId"]
語法取得 RouteData 中 userId 的值,並強制轉型成 int,然後它就跳 Exception 了。
這個問題其實只要用 int.Parse() 就可以解決我的問題了,但是我就在想能不能用一個 Generic 的方法,然後根據我想要的型別轉換好後回傳? 於是我就發現了 TypeConverter 這個古老的好物,並且利用它寫了一個 Parse
的方法。
利用 TypeDescriptor.GetConverter()
方法就可以取得某個型別的 TypeConverter,然後接著呼叫 TypeConverter.ConvertFrom()
方法就可以將某個實例轉換成我們需要的目標型別。
TypeConverter 不是任何型別都能轉換的,也是需要實作相對應的轉換器,以我的 Case 而言,只是需要將字串轉成數值或日期,而 .NET Framework 也已經針對大多數的實值型別內建好它們的 TypeConverter,所以對我來說夠用了。
因此實值型別之間的轉換基本上是沒有什麼問題的,如果我們自己定義的型別也要使用這種方式做轉換,就需要繼承 TypeConverter 然後覆寫一些方法去實作轉換器,至於要覆寫哪些方法就請參考給繼承者的注意事項。