TypeConverter 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
提供一種統一的方式,將值類型轉換為其他類型,並存取標準值與子屬性。
public ref class TypeConverter
public class TypeConverter
[System.Runtime.InteropServices.ComVisible(true)]
public class TypeConverter
type TypeConverter = class
[<System.Runtime.InteropServices.ComVisible(true)>]
type TypeConverter = class
Public Class TypeConverter
- 繼承
-
TypeConverter
- 衍生
- 屬性
範例
以下程式碼範例說明如何建立型別轉換器的實例並將其綁定到類別。 實作轉換器 MyClassConverter的類別必須繼承該 TypeConverter 類別。
public:
[TypeConverter(Sample::MyClassConverter::typeid)]
ref class MyClass
{
// Insert code here.
};
[TypeConverter(typeof(MyClassConverter))]
public class MyClass
{
// Insert code here.
}
<TypeConverter(GetType(MyClassConverter))> _
Public Class Class1
' Insert code here.
End Class
當你有一個包含列舉的屬性時,先確認列舉值是否有效再設定屬性。 下一個程式碼範例要求已宣告列舉 MyPropertyEnum 。
public:
property MyPropertyEnum MyProperty
{
void set( MyPropertyEnum value )
{
// Checks to see if the value passed is valid.
if ( !TypeDescriptor::GetConverter( MyPropertyEnum::typeid )->IsValid( value ) )
{
throw gcnew ArgumentException;
}
// The value is valid. Insert code to set the property.
}
}
public MyPropertyEnum MyProperty
{
set
{
// Checks to see if the value passed is valid.
if (!TypeDescriptor.GetConverter(typeof(MyPropertyEnum)).IsValid(value))
{
throw new ArgumentException($"{nameof(MyProperty)} is not valid");
}
// The value is valid. Insert code to set the property.
}
}
Public WriteOnly Property MyProperty() As MyPropertyEnum
Set
' Checks to see if the value passed is valid.
If Not TypeDescriptor.GetConverter(GetType(MyPropertyEnum)).IsValid(value) Then
Throw New ArgumentException()
End If
' The value is valid. Insert code to set the property.
End Set
End Property
另一種常見的型別轉換器用途是將物件轉換成字串。 以下程式碼範例列印出變數c中儲存的名稱Color。
Color c = Color::Red;
Console::WriteLine( TypeDescriptor::GetConverter( c )->ConvertToString( c ) );
Color c = Color.Red;
Console.WriteLine(TypeDescriptor.GetConverter(typeof(Color)).ConvertToString(c));
Dim c As Color = Color.Red
Console.WriteLine(TypeDescriptor.GetConverter(c).ConvertToString(c))
你也可以使用型別轉換器,從名稱轉換值,如下一個程式碼範例所示。
Color c = (Color)(TypeDescriptor::GetConverter( Color::typeid )->ConvertFromString( "Red" ));
(Color)TypeDescriptor.GetConverter(typeof(Color)).ConvertFromString("Red");
Dim c As Color = CType(TypeDescriptor.GetConverter(GetType(Color)).ConvertFromString("Red"), Color)
在以下程式碼範例中,你可以使用型別轉換器列印出物件所支援的標準值集合。
for each ( Color c in TypeDescriptor::GetConverter( Color::typeid )->GetStandardValues() )
{
Console::WriteLine( TypeDescriptor::GetConverter( c )->ConvertToString( c ) );
}
foreach (Color c in TypeDescriptor.GetConverter(typeof(Color)).GetStandardValues())
{
Console.WriteLine(TypeDescriptor.GetConverter(c).ConvertToString(c));
}
Dim c As Color
For Each c In TypeDescriptor.GetConverter(GetType(Color)).GetStandardValues()
Console.WriteLine(TypeDescriptor.GetConverter(c).ConvertToString(c))
Next c
備註
最常見的轉換器類型是將數據轉換為文字表示形式並從文字表示形式轉換回來的轉換器。 類別的類型轉換器會透過 TypeConverterAttribute綁定到該類別。 除非覆寫這個屬性,否則繼承自這個類別的所有類別都會使用與基類相同的類型轉換器。
備註
對於一般型別系統的用途,請勿直接存取型別轉換器。 相反地,請使用 TypeDescriptor。 欲了解更多資訊,請參閱提供的程式碼範例。
然而,使用 XAML 時,XAML 處理器會直接搜尋 , TypeConverterAttribute 而非經過 TypeDescriptor。 如果你真的想從程式碼中取得 TypeDescriptor 實例,或是在WPF資源中建立共享實例,直接建構它而不使用TypeDescriptor或其他反射與型別系統支援是可以接受的。
衍生出的 TypeConverter 類別常被引用為 XAML 處理器將標記(本質上為字串)轉換屬性或初始化文字值,並產生執行時表示物件的一部分。 想要支援 XAML 型態轉換行為的自訂型別作者,通常會實作一個 TypeConverter 類別,從字串中支援他們獨特的 ConvertFrom 行為。 此行為允許從作為 XAML 屬性值提供的字串進行型別轉換,並提供 XAML 處理器所需的支援,從字串建立物件,使該物件能在解析後的物件圖中產生。 自訂型別或自訂型別的成員會透過應用 TypeConverterAttribute 於定義來表示,屬性則參考自訂 TypeConverter 實作。 欲了解更多資訊,請參閱 XAML 類型轉換器概述。
給繼承者的注意事項
繼承並 TypeConverter 實施你自己的轉換要求。 當你從這個類別繼承時,可以覆寫以下方法:
為了支援自訂型別轉換,請覆寫 CanConvertFrom(ITypeDescriptorContext, Type)、 CanConvertTo(ITypeDescriptorContext, Type)、 ConvertFrom(ITypeDescriptorContext, CultureInfo, Object)和 ConvertTo(ITypeDescriptorContext, CultureInfo, Object, Type) 方法。
若要轉換必須重新建立物件以改變其值的型別,請覆寫 CreateInstance(ITypeDescriptorContext, IDictionary) and GetCreateInstanceSupported(ITypeDescriptorContext) 方法。
若要轉換支援屬性的型別,請覆寫 GetProperties(ITypeDescriptorContext, Object, Attribute[]) and GetPropertiesSupported(ITypeDescriptorContext) 方法。 如果你要轉換的類別沒有屬性,而你需要實作屬性,你可以用該 TypeConverter.SimplePropertyDescriptor 類別作為實作屬性描述符的基礎。 當你從 繼承 時 TypeConverter.SimplePropertyDescriptor,必須覆寫 和 GetValue(Object)SetValue(Object, Object) 方法。
若要轉換支援標準值的型別,請覆寫 GetStandardValues(ITypeDescriptorContext)、 GetStandardValuesExclusive(ITypeDescriptorContext)和 GetStandardValuesSupported(ITypeDescriptorContext)IsValid(ITypeDescriptorContext, Object) 方法。
注意:你的衍生型別可能會標記為 internal 或 private,但可以用該 TypeDescriptor 類別建立你的型別實例。 不要假設呼叫者是可信的,來寫出不安全的程式碼。 假設呼叫者可能會在部分信任中建立你類型類型的實例。
建構函式
| 名稱 | Description |
|---|---|
| TypeConverter() |
初始化 TypeConverter 類別的新執行個體。 |