類型轉換器是實現自訂伺服器控制項屬性過程中比較重要的內容。本文將對類型轉換器的基本概念和實現方法進行介紹。
1. 類型轉換器基本概念
類型轉換器是自訂伺服器控制項的輔助性功能實現。它主要用於執行從字串表示形式到指定類型之間的雙向轉換。例如,以文本形式表示屬性值,將使用者輸入的文本轉換為相應資料類型等等,都應用了類型轉換器。
對於多數基礎資料型別 (Elementary Data Type)(如Int32、Bool、Char、String、枚舉類型等),.net架構已經為它們提供了預設的類型轉換器,這些類型轉換器完成從字串到相關值的轉換並執行驗證檢查的功能。預設的類型轉換器派生自System.ComponentModel.TypeConverter類,名為TypeConverterNameConverter。例如,當開發人員在*.ASPx檔案中設定伺服器控制項屬性時會發現,某些屬性值為基本類型,即Bool、Char、Enum、Int等,但是,一律被設定為String類型,這就牽扯到一個類型轉換的問題。例如,屬性Height="150px",屬性值"150px"在設定時是String類型,而這裡的屬性值應當作為Unit類型,那麼所面臨的問題就是必須要求頁面編譯器將字串"150px"轉換為Unit類型。通常情況下,對於屬性值為基本類型的屬性,頁面編譯器將自動應用相關的類型轉換器完成轉換工作。在剛才的例子中,頁面編譯器將自動調用類型轉換器System.Web.UI.WebControls.UnitConverter完成String類型與Unit類型之間的相互轉換。
然而,上面的方法只能解決少數比較簡單的類型轉換問題,並且在多數情況下,相關的類型轉換過程都是預設自動完成的。當預設類型轉換器無法滿足需要時,例如,對於複雜屬性的情況,是沒有關聯的預設類型轉換器時,則可以通過實現自訂類型轉換器來實現。
自訂類型轉換器是本文的重點內容。按照自訂類型轉換器的功能分類,可以將自訂類型轉換器分為3種:
· 值翻譯的類型轉換器;
這種類型轉換器最為常見,它主要完成從字串到值得轉換,或用於在設計時和運行時進行資料類型之間的雙向翻譯。例如,實現從String類型轉換為表示在二維平面中定義點的、整數X和Y座標的有序對Point類型,或者從Point類型轉換為String類型。此處的String類型與Ponit類型之間的雙向轉換,則需要實現一個值翻譯的類型轉換器。
· 向屬性視窗提供標準值列表的類型轉換器;
在Visual Studio 2005中包括控制項屬性視窗。類型轉換器可以為屬性視窗中控制項的類型提供一個值列表。當開發人員單擊值列表時,則可以方便的在下拉式清單中設定屬性的值。
· 在運行時為屬性初始化產生代碼的類型轉換器;
.NET Framework 提供了在設計時產生動態屬性初始化代碼(此代碼在運行時初始化屬性)的功能。開發人員可以構建一個產生基於建構函式的初始化代碼的類型轉換器。為了在運行時配置類型屬性,這些類型轉換器可以使用在設計時設定的值來動態產生建構函式代碼。類型轉換器實現邏輯以配置屬性的類型和建構函式的值。
實現以上3種類型轉換器都要求自訂類型轉換器的類必須繼承自System.ComponentModel.TypeConverter基類,或者TypeConverter類的已有子類。下面簡單介紹一下TypeConverter及其子類的基本情況。
TypeConverter類主要提供了一種將值的類型轉換為其他類型,以及訪問標準值和子屬性的統一方法。該類包括多個成員方法。對於建立自訂類型轉換器而言,讀者應瞭解以下幾個常見方法:
(1)CanConvertFrom方法:返回該轉換器是否可以將一種類型的對象轉換為此轉換器的類型。
(2)ConvertFrom方法:將給定值轉換為此轉換器的類型。
(3)CanConvertTo方法:返回此轉換器是否可將該對象轉換為指定的類型。
(4)ConvertTo方法:將給定值對象轉換為指定的類型。
(5)IsValid方法:返回給定值對象對於此類型是否有效。
(6)GetStandardValuesSupported方法:返回此對象是否支援可以從列表中選取的標準值集。
(7)GetStandardValues方法:返回此類型轉換器設計用於的資料類型的標準值集合。
TypeConverter類是實作類別型轉換器的基礎。為了支援預設類型轉換功能,ASP.NET 2.0還對TypeConverter類進行了擴充,其內建了多個衍生類別。例如,CharConverter、DateTimeConverter、ExpandableObjectConverter、EnumConverter等。它們在完成類型轉換的同時,還可以協助開發人員建立自訂類型轉換器,例如,可建立繼承自ExpandableObjectConverter類的類型轉換器,該基類提供了在可擴充項物件與其他各種表示形式之間實現轉換的類型轉換器。這樣就可以簡化(相對於從TypeConverter基類)建立類型轉換器的過程。
另外,在使用已有類型轉換器過程要注意:無論何時都不要直接存取類型轉換器。而應通過使用TypeDescriptor調用適當的轉換器。
當實作類別型轉換器之後,可以使用如下方法應用類型轉換器。
[TypeConverter(typeof(MyClassConverter))]
public class MyClass {
// Insert code here.
}
以上代碼顯示了類型轉換器的應用方法。其通知MyClass使用名為MyClassConverter的類型轉換器。此樣本假定已在其他位置實現了MyClassConverter。在應用過程中需要注意,中繼資料屬性TypeConverter通常應用於複雜屬性或資料成員,以將其與類型轉換器關聯。如果將TypeConverter應用於類型,則不必將其再次應用於該類型的屬性或資料成員。