深度解析 TypeConverter & TypeConverterAttribute (一)
前言
我们在开发复杂控件的时候不可避免的碰到类型转换TypeConverter,微软给我们提供了很多转换类如ArrayConverter,BaseNumberConverter,BooleanConverter(MSDN上更多:ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref3/html/N_System_ComponentModel.htm) 等直接或间接的继承了TypeConverter类。我们在类型转换的时候经常用到这些类。然而我们如何编写自定义的TypeConverter类呢,又怎么样在复杂控件中使用呢。
TypeConverter Class
TypeConverter类就是将一种类型(object,可以说是任何类型)转换到另一种类型(一般为string),或者将另一种类型转换回来。所有继承TypeConverter类型的都必须实现4个方法:(这里以另一种类型string为例)
CanConverterTo 有两个重载方法,
TypeConverter.CanConvertTo (Type)
TypeConverter.CanConvertTo (ITypeDescriptorContext, Type)
都有一个Type参数(要转换成什么类型),例如我们设计的要转换成string,在方法体里面判断这个参数的Type如果是string,则返回true,否则返回 false
ConverterTo 也有两重载,
TypeConverter.ConvertTo (Object, Type)
TypeConverter.ConvertTo (ITypeDescriptorContext, CultureInfo, Object, Type)
都有Object和Type参数,将Object转成Type类型的Object,返回Type类型的Object。
下面类似的两个方法,不过方向相反,是从其他类型装换回来。
CanConverterFrom 重载,
TypeConverter.CanConvertFrom (Type)
TypeConverter.CanConvertFrom (ITypeDescriptorContext, Type)
在方法体里面判断参数Type是不是能转换回来的类型,例如string类型,如果是返回true,否则返回false。
ConverterFrom 重载,
TypeConverter.ConvertFrom (Object)
TypeConverter.ConvertFrom (ITypeDescriptorContext, CultureInfo, Object)
在方法体里面判断参数Object的类型是不是能转换回来的类型,例如string类型,如果是返回转换回来的类型。
举例说明,以GPS经纬度位置为例,经纬度位置GPSLocation包括复杂属性经度
首先我们得有个Longtitude类吧。
自然,这样我们是不是要写个转换类比较好呢,这个类必须直接或这间接继承TypeConverter类。
class LongitudeTypeConverter : TypeConverter
{
}
然后重载实现上面说的四个方法,现在我要Longitude类转换到string类型
有了这个转换类LongitudeTypeConverter,该怎么使用呢。其实很简单就是使用我们上面实现的四个方法,
10E11'12''
10
East
11
12
从结果中我们可以看到实现了我们预期的效果。
这些在一般代码里面可以用到,但从转换的结果中我们可以联想,web页面设计的两种模式(设计模式,源代码模式),在源代码模式我们显示的是string,但在设计模式我们显示控件的外观,这里就关系到TypeConverter类了,当然还有TypeConverterAtrribute。
下面就要说下这个TypeConverterAtrribute了。
待续...
参考:
http://www.codeproject.com/KB/webforms/TypeConverters.aspx
我们在开发复杂控件的时候不可避免的碰到类型转换TypeConverter,微软给我们提供了很多转换类如ArrayConverter,BaseNumberConverter,BooleanConverter(MSDN上更多:ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref3/html/N_System_ComponentModel.htm) 等直接或间接的继承了TypeConverter类。我们在类型转换的时候经常用到这些类。然而我们如何编写自定义的TypeConverter类呢,又怎么样在复杂控件中使用呢。
TypeConverter Class
TypeConverter类就是将一种类型(object,可以说是任何类型)转换到另一种类型(一般为string),或者将另一种类型转换回来。所有继承TypeConverter类型的都必须实现4个方法:(这里以另一种类型string为例)
CanConverterTo 有两个重载方法,
TypeConverter.CanConvertTo (Type)
TypeConverter.CanConvertTo (ITypeDescriptorContext, Type)
都有一个Type参数(要转换成什么类型),例如我们设计的要转换成string,在方法体里面判断这个参数的Type如果是string,则返回true,否则返回 false
ConverterTo 也有两重载,
TypeConverter.ConvertTo (Object, Type)
TypeConverter.ConvertTo (ITypeDescriptorContext, CultureInfo, Object, Type)
都有Object和Type参数,将Object转成Type类型的Object,返回Type类型的Object。
下面类似的两个方法,不过方向相反,是从其他类型装换回来。
CanConverterFrom 重载,
TypeConverter.CanConvertFrom (Type)
TypeConverter.CanConvertFrom (ITypeDescriptorContext, Type)
在方法体里面判断参数Type是不是能转换回来的类型,例如string类型,如果是返回true,否则返回false。
ConverterFrom 重载,
TypeConverter.ConvertFrom (Object)
TypeConverter.ConvertFrom (ITypeDescriptorContext, CultureInfo, Object)
在方法体里面判断参数Object的类型是不是能转换回来的类型,例如string类型,如果是返回转换回来的类型。
举例说明,以GPS经纬度位置为例,经纬度位置GPSLocation包括复杂属性经度
Longitude和纬度
Latitude
。现我们根据其一属性Longitude类写个LongtitudeTypeConverter类。首先我们得有个Longtitude类吧。
public class Longitude
{
private int _Degrees;
private int _Minutes;
private int _Seconds;
private LongitudeDirection _Direction;
/// <summary>
/// 度数
/// </summary>
public int Degrees { }
/// <summary>
/// 分度
/// </summary>
public int Minutes { }
/// <summary>
/// 秒读
/// </summary>
public int Seconds { }
/// <summary>
/// 方向
/// </summary>
public LongitudeDirection Direction
{
}
}
有了个这个类,我们怎样将其转换到string类或其他类呢(这里假设string类)例如“24W3'4”形式,也许你会说重写ToString()方法不就行了,似乎可行,但如果转换成其他类呢,又从其他类转换回来呢,怎么办。还有在复杂控件中Designer设计中又该怎么办。(在复杂控件的应用稍后介绍){
private int _Degrees;
private int _Minutes;
private int _Seconds;
private LongitudeDirection _Direction;
/// <summary>
/// 度数
/// </summary>
public int Degrees { }
/// <summary>
/// 分度
/// </summary>
public int Minutes { }
/// <summary>
/// 秒读
/// </summary>
public int Seconds { }
/// <summary>
/// 方向
/// </summary>
public LongitudeDirection Direction
{
}
}
自然,这样我们是不是要写个转换类比较好呢,这个类必须直接或这间接继承TypeConverter类。
class LongitudeTypeConverter : TypeConverter
{
}
然后重载实现上面说的四个方法,现在我要Longitude类转换到string类型
CanConverterFrom
CanConverterTo
ConvertTo
ConvertFrom
有了这个转换类LongitudeTypeConverter,该怎么使用呢。其实很简单就是使用我们上面实现的四个方法,
class Test
{
public static void Main(string[] args)
{
//将Longitude类转换到string类型
Longitude longitude = new Longitude(10,11,12,LongitudeDirection.East);
LongitudeTypeConverter converter = new LongitudeTypeConverter();
string strLongitude="";
if (converter.CanConvertTo(typeof(string)))
{
strLongitude = (string)converter.ConvertTo(longitude, typeof(string));
}
System.Console.WriteLine(strLongitude);
//将string还原回Longitude类
Longitude longitude1 = new Longitude();
if (converter.CanConvertFrom(typeof(string)))
{
longitude1 = (Longitude)converter.ConvertFrom(strLongitude);
}
System.Console.WriteLine(longitude1.Degrees);
System.Console.WriteLine(longitude1.Direction);
System.Console.WriteLine(longitude1.Minutes);
System.Console.WriteLine(longitude1.Seconds);
}
}
输出结果是{
public static void Main(string[] args)
{
//将Longitude类转换到string类型
Longitude longitude = new Longitude(10,11,12,LongitudeDirection.East);
LongitudeTypeConverter converter = new LongitudeTypeConverter();
string strLongitude="";
if (converter.CanConvertTo(typeof(string)))
{
strLongitude = (string)converter.ConvertTo(longitude, typeof(string));
}
System.Console.WriteLine(strLongitude);
//将string还原回Longitude类
Longitude longitude1 = new Longitude();
if (converter.CanConvertFrom(typeof(string)))
{
longitude1 = (Longitude)converter.ConvertFrom(strLongitude);
}
System.Console.WriteLine(longitude1.Degrees);
System.Console.WriteLine(longitude1.Direction);
System.Console.WriteLine(longitude1.Minutes);
System.Console.WriteLine(longitude1.Seconds);
}
}
10E11'12''
10
East
11
12
从结果中我们可以看到实现了我们预期的效果。
这些在一般代码里面可以用到,但从转换的结果中我们可以联想,web页面设计的两种模式(设计模式,源代码模式),在源代码模式我们显示的是string,但在设计模式我们显示控件的外观,这里就关系到TypeConverter类了,当然还有TypeConverterAtrribute。
下面就要说下这个TypeConverterAtrribute了。
待续...
参考:
http://www.codeproject.com/KB/webforms/TypeConverters.aspx