
组件编程之TypeConverterAttribute
发布时间:2006-03-29 14:20:09 来源:博客园 网友评论 0 条
今天的这篇文章,我主要是带来PropertyAttribute里的TypeConverterAttribute的讲解,首先在这里讲讲TypeConverterAttribute的作用是什么:当Component的某个Property被设置时,如Size="60,70",解析器会通过类型转化器,把这个字符串自动转换为属性声明的类型。.net的框架中已经声明了很多的类型转化器,下面的代码中有列举到。有点类似于operator。
同时在Asp.net服务器控件的编写中TypeConverterAttribute也将会非常有用,服务器控件的Property只能以string形式保存在aspx页面里,而在服务器控件的DesignTime和RunTime时必须要把string转换为相应的类型。
源代码如下:
同时在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; } } } } |
![]() ![]() |
推荐阅讯
- 在Oracle数据库上构建.NET应用程序
- 一个用于J2EE应用程序的异常处理框架
- Web2.0公司所要做的就是撕掉Web2.0标签
- OpenGL编程轻松入门之曲面和曲线
- 你的代码真的很健壮吗
- 创建可移植的64位应用程序代码
- VS2005+Crystal Report开发Web应用
- 游戏编程入门之精灵ISprite
- Oracle 9i 数据库WITH查询语法小议
- Oracle数据库的安全策略
阅读排行
- 1..net页面间的参数传递简单实例
- 2.VC++与Matlab混合编程之引擎操作详解
- 3.Oracle数据库数据对象分析
- 4.Eclipse3.2+Tomcat5.5.17+Oracle9配置
- 5.Oracle数据库中索引的维护
- 6.在Oracle的网络结构中解决连接问题
- 7.Oracle数据安全面面观
- 8.Oracle数据库的ORA-00257故障解决过程
- 9.Oracle数据库备份与恢复的三种方法
- 10.Oracle与SQL Server在企业应用中的比较
专题教程
- 大话G游 专题:手机病毒揭密
- ARP攻击防范与解决方案 路由故障处理手册
- Picasa中文版_Picasa教程 专题:清除流氓软件
- Firefox专题 seo搜索引擎优化专区
- 重装Windows必知的事情 装机之必备软件大行动
病毒专杀栏


