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();
}
// 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 c = (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 的类。 除非重写此属性,否则从此类继承的所有类都使用与基类相同的类型转换器。
备注
出于常规类型系统目的,请勿直接访问类型转换器。 Instead, access the appropriate converter by using TypeDescriptor. 有关详细信息,请参阅提供的代码示例。
但是,使用 XAML 时,XAML 处理器会直接搜索 TypeConverterAttribute ,而不是浏览 TypeDescriptor。 对于需要 TypeDescriptor 来自代码的实例或在 WPF 资源中创建共享实例的情况,可以直接构造该实例,而无需引用 TypeDescriptor 或其他反射和类型系统支持即可构造它。
派生自 TypeConverter 的类通常作为 XAML 处理器如何转换标记或初始化文本值的一部分引用,该标记 (该标记本质上是字符串) ,并为运行时表示形式生成对象。 打算支持 XAML 的类型转换行为的自定义类型作者通常实现一个类,该类支持字符串中自己的唯ConvertFrom
一TypeConverter行为。 此行为允许从作为 XAML 属性值提供的字符串进行类型转换,并为 XAML 处理器提供从字符串创建对象所需的支持,以便对象可以在分析的对象图中生成。 自定义类型或自定义类型的成员通过应用于 TypeConverterAttribute 定义来指示,属性引用自定义 TypeConverter 实现。 有关详细信息,请参阅 XAML 类型转换器概述。
继承者说明
继承自 TypeConverter 实现自己的转换要求。 从此类继承时,可以重写以下方法:
若要支持自定义类型转换,请重写 CanConvertFrom(ITypeDescriptorContext, Type)、CanConvertTo(ITypeDescriptorContext, Type)和ConvertFrom(ITypeDescriptorContext, CultureInfo, Object)ConvertTo(ITypeDescriptorContext, CultureInfo, Object, Type)方法。
若要转换必须重新创建对象以更改其值的类型,请重写 CreateInstance(ITypeDescriptorContext, IDictionary) 和 GetCreateInstanceSupported(ITypeDescriptorContext) 方法。
若要转换支持属性的类型,请重写 GetProperties(ITypeDescriptorContext, Object, Attribute[]) 和 GetPropertiesSupported(ITypeDescriptorContext) 方法。 如果要转换的类没有属性,并且需要实现属性,则可以将该 TypeConverter.SimplePropertyDescriptor 类用作实现属性描述符的基础。 从 TypeConverter.SimplePropertyDescriptor继承时,必须重写 GetValue(Object) 和 SetValue(Object, Object) 方法。
若要转换支持标准值的类型,请重写GetStandardValues(ITypeDescriptorContext)和 GetStandardValuesExclusive(ITypeDescriptorContext)GetStandardValuesSupported(ITypeDescriptorContext) IsValid(ITypeDescriptorContext, Object)方法。
注意:派生类型可能标记为 internal
或 private
,但可以使用类创建 TypeDescriptor 类型的实例。 假设调用方受信任,请不要编写不安全的代码。 假设调用方可能会在部分信任中创建类型的实例。
有关常规 (非 XAML) 用途的类型转换器的详细信息,请参阅 如何:实现类型转换器 或 通用类型转换。
构造函数
TypeConverter() |
初始化 TypeConverter 类的新实例。 |