自定义类型转换器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System;
using System.ComponentModel;
using System.Globalization;
using System.Drawing;

public class PointConverter : TypeConverter {
// Overrides the CanConvertFrom method of TypeConverter.
// The ITypeDescriptorContext interface provides the context for the
// conversion. Typically, this interface is used at design time to
// provide information about the design-time container.
public override bool CanConvertFrom(ITypeDescriptorContext context,
Type sourceType) {

if (sourceType == typeof(string)) {
return true;
}
return base.CanConvertFrom(context, sourceType);
}
// Overrides the ConvertFrom method of TypeConverter.
public override object ConvertFrom(ITypeDescriptorContext context,
CultureInfo culture, object value) {
if (value is string) {
string[] v = ((string)value).Split(new char[] {','});
return new Point(int.Parse(v[0]), int.Parse(v[1]));
}
return base.ConvertFrom(context, culture, value);
}
// Overrides the ConvertTo method of TypeConverter.
public override object ConvertTo(ITypeDescriptorContext context,
CultureInfo culture, object value, Type destinationType) {
if (destinationType == typeof(string)) {
return ((Point)value).X + "," + ((Point)value).Y;
}
return base.ConvertTo(context, culture, value, destinationType);
}
}

[TypeConverter(typeof(PointConverter ))]
public class MyClass {
// Insert code here.
}

public void convert<T>(object sourceVal, ref T targetVal){
TypeConverter converter = TypeDescriptor.GetConverter(targetVal.GetType());
if(converter.CanConvertFrom(sourceVal.GetType()))
targetVal = (T)converter.ConvertFromString(sourceVal);
}

Microsoft官方文档

TypeConverter 类

  • 参考

定义

提供一种将值的类型转换为其他类型以及访问标准值和子属性的统一方法。

C#复制

1
public class TypeConverter

示例

下面的代码示例演示如何创建类型转换器的实例并将其绑定到类。 实现转换器 MyClassConverter的类必须继承自 TypeConverter 该类。

C#复制

1
2
3
4
[TypeConverter(typeof(MyClassConverter))]
public class MyClass {
// Insert code here.
}

如果属性具有枚举,请检查枚举值在设置属性之前是否有效。 下一个代码示例要求声明调用 MyPropertyEnum 的枚举。

C#复制

1
2
3
4
5
6
7
8
9
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.
}
}

另一种常见的类型转换器用法是将对象转换为字符串。 下面的代码示例输出变量中c存储的名称Color

C#复制

1
2
Color c = Color.Red;
Console.WriteLine(TypeDescriptor.GetConverter(typeof(Color)).ConvertToString(c));

还可以使用类型转换器从其名称转换值,如下一个代码示例所示。

C#复制

1
Color c = (Color)TypeDescriptor.GetConverter(typeof(Color)).ConvertFromString("Red");

在下面的代码示例中,可以使用类型转换器输出对象支持的标准值集。

C#复制

1
2
3
foreach(Color c in TypeDescriptor.GetConverter(typeof(Color)).GetStandardValues()) {
Console.WriteLine(TypeDescriptor.GetConverter(c).ConvertToString(c));
}

注解

最常见的转换器类型是来回转换文本表示形式的转换器。 类的类型转换器绑定到具有 TypeConverterAttribute 的类。 除非重写此属性,否则从此类继承的所有类都使用与基类相同的类型转换器。

备注

出于常规类型系统目的,请勿直接访问类型转换器。 Instead, access the appropriate converter by using TypeDescriptor. 有关详细信息,请参阅提供的代码示例。

但是,使用 XAML 时,XAML 处理器会直接搜索 TypeConverterAttribute ,而不是浏览 TypeDescriptor。 对于需要 TypeDescriptor 来自代码的实例或在 WPF 资源中创建共享实例的情况,可以直接构造该实例,而无需引用 TypeDescriptor 或其他反射和类型系统支持即可构造它。

派生自 TypeConverter 的类通常作为 XAML 处理器如何转换标记或初始化文本值的一部分引用,该标记 (该标记本质上是字符串) ,并为运行时表示形式生成对象。 打算支持 XAML 的类型转换行为的自定义类型作者通常实现一个类,该类支持字符串中自己的唯ConvertFromTypeConverter行为。 此行为允许从作为 XAML 属性值提供的字符串进行类型转换,并为 XAML 处理器提供从字符串创建对象所需的支持,以便对象可以在分析的对象图中生成。 自定义类型或自定义类型的成员通过应用于 TypeConverterAttribute 定义来指示,属性引用自定义 TypeConverter 实现。 有关详细信息,请参阅 XAML 类型转换器概述

继承者说明

继承自 TypeConverter 实现自己的转换要求。 从此类继承时,可以重写以下方法:

注意:派生类型可能标记为 internalprivate,但可以使用类创建 TypeDescriptor 类型的实例。 假设调用方受信任,请不要编写不安全的代码。 假设调用方可能会在部分信任中创建类型的实例。

有关常规 (非 XAML) 用途的类型转换器的详细信息,请参阅 如何:实现类型转换器通用类型转换

构造函数

TypeConverter() 初始化 TypeConverter 类的新实例。

方法

CanConvertFrom(ITypeDescriptorContext, Type) 返回该转换器是否可以使用指定上下文将给定类型的对象转换为此转换器的类型。
CanConvertFrom(Type) 返回该转换器是否可以将给定类型的对象转换为此转换器的类型。
CanConvertTo(ITypeDescriptorContext, Type) 返回此转换器能否使用指定上下文将对象转换为指定类型。
CanConvertTo(Type) 返回此转换器是否可将该对象转换为指定的类型。
ConvertFrom(ITypeDescriptorContext, CultureInfo, Object) 使用指定的上下文和区域性信息将给定对象转换为此转换器的类型。
ConvertFrom(Object) 将给定值转换为此转换器的类型。
ConvertFromInvariantString(ITypeDescriptorContext, String) 使用不变区域性和指定上下文将给定字符串转换为此转换器的类型。
ConvertFromInvariantString(String) 使用不变区域性将给定字符串转换为此转换器的类型。
ConvertFromString(ITypeDescriptorContext, CultureInfo, String) 使用指定的上下文和区域性信息将给定的文本转换为对象。
ConvertFromString(ITypeDescriptorContext, String) 使用指定的上下文将给定的文本转换为对象。
ConvertFromString(String) 将指定文本转换为对象。
ConvertTo(ITypeDescriptorContext, CultureInfo, Object, Type) 使用指定的上下文和区域性信息将给定值对象转换为指定的类型。
ConvertTo(Object, Type) 使用参数将给定的值对象转换为指定的类型。
ConvertToInvariantString(ITypeDescriptorContext, Object) 使用指定的上下文将指定的值转换为区域性不变的字符串表示形式。
ConvertToInvariantString(Object) 将指定值转换为区域性不变的字符串表示形式。
ConvertToString(ITypeDescriptorContext, CultureInfo, Object) 使用指定的上下文和区域性信息将给定的值转换为字符串表示形式。
ConvertToString(ITypeDescriptorContext, Object) 使用给定的上下文将给定的值转换为字符串表示形式。
ConvertToString(Object) 将指定值转换为字符串表示形式。
CreateInstance(IDictionary) 在给定 Object 的一组属性值的情况下重新创建该对象。
CreateInstance(ITypeDescriptorContext, IDictionary) 给定该对象的一组属性值,使用指定上下文创建与此 TypeConverter 相关联的类型的实例。
Equals(Object) 确定指定对象是否等于当前对象。(继承自 Object)
GetConvertFromException(Object) 返回当转换无法执行时所引发的异常。
GetConvertToException(Object, Type) 返回当转换无法执行时所引发的异常。
GetCreateInstanceSupported() 返回更改此对象的值是否求调用 CreateInstance(IDictionary) 方法来创建新值。
GetCreateInstanceSupported(ITypeDescriptorContext) 返回一个结果,即更改此对象上的某个值是否需要调用 CreateInstance(IDictionary) 以使用指定的上下文创建新值。
GetHashCode() 作为默认哈希函数。(继承自 Object)
GetProperties(ITypeDescriptorContext, Object) 使用指定的上下文返回值参数指定的数组类型的属性的集合。
[GetProperties(ITypeDescriptorContext, Object, Attribute]) 使用指定的上下文和特性返回由该值参数指定的数组类型的属性集合。
GetProperties(Object) 返回由值参数指定的数组类型的属性集合。
GetPropertiesSupported() 返回此对象是否支持属性。
GetPropertiesSupported(ITypeDescriptorContext) 通过使用指定的上下文,返回此对象是否支持属性。
GetStandardValues() 从默认的上下文返回此类型转换器设计用于的数据类型的标准值集合。
GetStandardValues(ITypeDescriptorContext) 当与格式上下文一起提供时,返回此类型转换器设计用于的数据类型的标准值集合。
GetStandardValuesExclusive() 返回从 GetStandardValues() 返回的标准值的集合是否为独占列表。
GetStandardValuesExclusive(ITypeDescriptorContext) 使用指定的上下文返回从 GetStandardValues() 返回的标准值的集合是否为可能值的独占列表。
GetStandardValuesSupported() 返回此对象是否支持可以从列表中选取的标准值集。
GetStandardValuesSupported(ITypeDescriptorContext) 使用指定的上下文返回此对象是否支持可以从列表中选取的标准值集。
GetType() 获取当前实例的 Type。(继承自 Object)
IsValid(ITypeDescriptorContext, Object) 返回给定的值对象是否对此类型和对指定的上下文有效。
IsValid(Object) 返回给定值对象对于此类型是否有效。
MemberwiseClone() 创建当前 Object 的浅表副本。(继承自 Object)
[SortProperties(PropertyDescriptorCollection, String]) 对属性的集合进行排序。
ToString() 返回表示当前对象的字符串。(继承自 Object)

适用于

产品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Standard 2.0, 2.1
Xamarin.iOS 10.8
Xamarin.Mac 3.0

另请参阅