C#类型转换器的实现浅析

开发 后端
C#类型转换器的实现是如何办到的呢?我们在C# WinForm控件开发中是怎么实现的呢?需要哪些方法呢?那么这里就向你介绍具体的实现过程以及实例。

C#类型转换器的实现是如何的呢?具体的操作是什么呢?那么这里就向你介绍C#类型转换器的实现需要重写四个方法,下面我们来具体看看细节是如何操作的。

C#类型转换器的实现所用重写的方法:

◆CanConvertFrom()――根据类型参数进行测试,判断是否能从这个类型转换成当前类型,在本例中我们只提供转换string和InstanceDescriptor类型的能力。

◆CanConvertTo()――根据类型参数进行测试,判断是否能从当前类型转换成指定的类型。

◆ConvertTo()――将参数value的值转换为指定的类型。

◆ConvertFrom()――串换参数value,并返回但书类型的一个对象。

C#类型转换器的实现实例:

  1. public override object ConvertTo(  
  2. ITypeDescriptorContext context,  
  3.  System.Globalization.CultureInfo culture,   
  4. object value, Type destinationType)  
  5. {  
  6. String result = "";  
  7. if (destinationType == typeof(String))  
  8. {  
  9. Scope scope = (Scope)value;  
  10. result = scope.Min.ToString()+"," + scope.Max.ToString();  
  11. return result;  
  12.  
  13. }  
  14.  
  15. if (destinationType == typeof(InstanceDescriptor))  
  16. {  
  17. ConstructorInfo ci =   
  18. typeof(Scope).GetConstructor(  
  19. new Type[] {typeof(Int32),typeof(Int32) });  
  20. Scope scope = (Scope)value;  
  21. return new InstanceDescriptor(  
  22. ci, new object[] { scope.Min,scope.Max });  
  23. }  
  24. return base.ConvertTo(context,   
  25. culture, value, destinationType);  
  26. }  

上面是ConvertTo的实现,如果转换的目标类型是string,我将Scope的两个属性转换成string类型,并且用一个“,”连接起来,这就是我们在属性浏览器里看到的表现形式,如图:

Scope的两个属性转换成string类型 

如果转换的目标类型是实例描述器(InstanceDescriptor,它负责生成实例化的代码),我们需要构造一个实例描述器,构造实例描述器的时候,我们要利用反射机制获得Scope类的构造器信息,并在new的时候传入Scope实例的两个属性值。实例描述器会为我们生成这样的代码:this.myListControl1.Scope = new CustomControlSample.Scope(10, 200);在最后不要忘记调用 base.ConvertTo(context, culture, value, destinationType),你不需要处理的转换类型,交给基类去做好了。

  1.  public override object ConvertFrom(  
  2. ITypeDescriptorContext context,   
  3. System.Globalization.CultureInfo culture,   
  4. object value)  
  5. {  
  6. if (value is string)  
  7. {  
  8. String[] v = ((String)value).Split(',');  
  9. if (v.GetLength(0) != 2)  
  10. {  
  11. throw new ArgumentException(  
  12. "Invalid parameter format");  
  13. }  
  14.  
  15. Scope csf = new Scope();  
  16. csf.Min = Convert.ToInt32(v[0]);  
  17. csf.Max = Convert.ToInt32(v[1]);  
  18. return csf;  
  19. }  
  20. return base.ConvertFrom(context, culture, value);  
  21. }  
  22. }  

上面是ConvertFrom的代码,由于系统能够直接将实例描述器转换为Scope类型,所以我们就没有必要再写代码,我们只需要关注如何将String(在属性浏览出现的属性值的表达)类型的值转换为Scope类型。没有很复杂的转换,只是将这个字符串以“,”分拆开,并串换为Int32类型,然后new一个Scope类的实例,将分拆后转换的两个整型值赋给Scope的实例,然后返回实例。在这段代码里,我们要判断一下用户设定的属性值是否有效。比如,如果用户在Scope属性那里输入了“10200”,由于没有输入“,”,我们无法将属性的值分拆为两个字符串,也就无法进行下面的转换,所以,我们要抛出一个异常,通知用户重新输入。

C#类型转换器的实现的相关内容就向你介绍到这里,希望对你了解和学习C#类型转换器的实现有所帮助。

【编辑推荐】

  1. C# Attribute的概念与使用浅析
  2. C# AttributeUsage的使用浅析
  3. 浅析Attribute在C# WinForm控件开发中的使用
  4. 浅谈C#控件属性串行化的实现
  5. C#实例详解TypeConverterAttribute应用
责任编辑:仲衡 来源: CSDN博客
相关推荐

2009-08-24 14:20:13

C# 强制类型转换

2009-09-01 16:35:55

C#操作String数

2010-06-10 14:33:03

协议转换器

2009-08-07 09:33:23

ASP.NET控件开发

2009-08-18 09:37:14

C#枚举类型

2009-08-18 12:52:33

C#枚举类型

2009-08-06 10:14:15

C#引用类型数组

2009-08-18 10:35:46

C#枚举类型

2009-09-04 09:27:48

C#调用浏览器

2009-12-28 13:38:35

WPF类型转换器

2009-09-02 17:24:44

C#关机代码

2009-09-07 09:36:29

C# DisposeDispose方法

2010-06-17 23:31:35

协议转换器

2009-08-26 09:54:45

C#打印预览C#打印

2009-08-26 15:04:35

C#转换

2009-08-18 13:00:59

C#枚举类型

2009-08-24 14:51:25

C# 泛型泛型类型

2009-09-04 10:05:16

C#调用浏览器浏览器的原理

2009-09-01 18:29:24

C#实现多个接口

2009-08-31 16:48:02

C#实现IDispos
点赞
收藏

51CTO技术栈公众号