ASP.NET2.0伺服器控制元件之型別轉換器

NO IMAGE

  型別轉換器是實現自定義伺服器控制元件屬性過程中比較重要的內容。本文將對型別轉換器的基本概念和實現方法進行介紹。

  1. 型別轉換器基本概念

  型別轉換器是自定義伺服器控制元件的輔助性功能實現。它主要用於執行從字串表示形式到指定型別之間的雙向轉換。例如,以文字形式表示屬性值,將使用者輸入的文字轉換為相應資料型別等等,都應用了型別轉換器。

  對於多數基本資料型別(如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應用於型別,則不必將其再次應用於該型別的屬性或資料成員。

您可能感興趣的文章:

C#簡易圖片格式轉換器實現方法C#實現將畫素轉換為頁面單位的方法C#設定頁面單位和縮放的方法C#單位轉換器簡單案例