Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16500465
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 21:06:10

下载本文示例代码
  今天的这篇文章,我主要是带来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基类。 {  /**////   /// 是否能用string转换到Size类型。  ///   /// 上下文。  /// 转换源的Type。  ///   public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)  {   if (sourceType == typeof(string))    { return true; }   else    { return false; }  }  /**////   /// 从string转到Size类型。  ///   /// 提供Component的上下文,如Component.Instance对象等。  /// 提供区域信息,如语言、时间格式、货币格式等  ///   ///   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]));  }  /**////   /// 是否能用Size转换到string类型。  ///   ///   /// 转换目标的类型。  ///   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; }  } }}   今天的这篇文章,我主要是带来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基类。 {  /**////   /// 是否能用string转换到Size类型。  ///   /// 上下文。  /// 转换源的Type。  ///   public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)  {   if (sourceType == typeof(string))    { return true; }   else    { return false; }  }  /**////   /// 从string转到Size类型。  ///   /// 提供Component的上下文,如Component.Instance对象等。  /// 提供区域信息,如语言、时间格式、货币格式等  ///   ///   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]));  }  /**////   /// 是否能用Size转换到string类型。  ///   ///   /// 转换目标的类型。  ///   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; }  } }} 下载本文示例代码


组件编程之TypeConverterAttribute组件编程之TypeConverterAttribute组件编程之TypeConverterAttribute组件编程之TypeConverterAttribute组件编程之TypeConverterAttribute组件编程之TypeConverterAttribute组件编程之TypeConverterAttribute组件编程之TypeConverterAttribute组件编程之TypeConverterAttribute组件编程之TypeConverterAttribute组件编程之TypeConverterAttribute组件编程之TypeConverterAttribute组件编程之TypeConverterAttribute组件编程之TypeConverterAttribute组件编程之TypeConverterAttribute
阅读(235) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~