分享
 
 
 

组件编程之TypeConverterAttribute

王朝other·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

今天的这篇文章,我主要是带来PropertyAttribute里的TypeConverterAttribute的讲解,首先在这里讲讲TypeConverterAttribute的作用是什么:当Component的某个Property被设置时,如Size="60,70",解析器会通过类型转化器,把这个字符串自动转换为属性声明的类型。.net的框架中已经声明了很多的类型转化器,下面的代码中有列举到。有点类似于operator。

同时在Asp.net服务器控件的编写中TypeConverterAttribute也将会非常有用,服务器控件的Property只能以string形式保存在aspx页面里,而在服务器控件的DesignTime和RunTime时必须要把string转换为相应的类型。

源代码如下:

using System;

using System.Collections.Generic;

using System.Text;

using System.ComponentModel;

using System.Globalization;

namespace ClassLibrary1

{

public class Class1 : Component

{

private Size _size;

public Class1()

{

_size = new Size();

}

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]

[TypeConverter(typeof(SizeConverter))] // —— 注1,也可以把这句TypeConverterAttribute写在注2处。

public Size Size

{

get { return _size; }

set { _size = value; }

}

}

public class SizeConverter : TypeConverter // 我们自定义的Converter必须继承于TypeConverter基类。

{

/**//// <summary>

/// 是否能用string转换到Size类型。

/// </summary>

/// <param name="context">上下文。</param>

/// <param name="sourceType">转换源的Type。</param>

/// <returns></returns>

public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)

{

if (sourceType == typeof(string))

{ return true; }

else

{ return false; }

}

/**//// <summary>

/// 从string转到Size类型。

/// </summary>

/// <param name="context">提供Component的上下文,如Component.Instance对象等。</param>

/// <param name="culture">提供区域信息,如语言、时间格式、货币格式等</param>

/// <param name="value"></param>

/// <returns></returns>

public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)

{

if (value == null || value.ToString().Length == 0) return new Size();

char spliter = culture.TextInfo.ListSeparator[0]; // 得到字符串的分隔符

string[] ss = ((string)value).Split(spliter);

Int32Converter intConverter = new Int32Converter(); // 得到类型转换器,.net中为我们定义了一些常见的类型转换器。

return new Size((Int32)intConverter.ConvertFromString(context, culture, ss[0]),

(Int32)intConverter.ConvertFromString(context, culture, ss[1]));

}

/**//// <summary>

/// 是否能用Size转换到string类型。

/// </summary>

/// <param name="context"></param>

/// <param name="destinationType">转换目标的类型。</param>

/// <returns></returns>

public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)

{

if (destinationType == typeof(Size)) // 如果是Size格式,则允许转成string。

{ return true; }

else

{ return false; }

}

// 在Property窗口中显示为string类型。

public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)

{

if (value == null) return string.Empty;

if (destinationType == typeof(string))

{

Size size = (Size)value;

TypeConverter intConverter = TypeDescriptor.GetConverter(typeof(Int32)); // 能到类型转换器的另一种方式。

char spliter = culture.TextInfo.ListSeparator[0]; // 得到字符串的分隔符

return string.Join(spliter.ToString(), new string[]{

intConverter.ConvertToString(context, culture, size.Length),

intConverter.ConvertToString(context, culture, size.Width)});

}

return string.Empty;

}

// TypeConverter还有几个虚方法,请大家自己研究。

}

// [TypeConverter(typeof(SizeConverter))] —— 注2

public class Size

{

private Int32 _length;

private Int32 _width;

public Size(Int32 length, Int32 width)

{

_length = length;

_width = width;

}

public Size() : this(0, 0)

{}

public Int32 Length

{

get { return _length; }

set { _length = value; }

}

public Int32 Width

{

get { return _width; }

set { _width = value; }

}

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有