白话Programming
2006年12月14日
WinForm控件开发总结(六)-----控件属性类型转换器代码详解
在上一篇文章,我为控件添加一个一个复杂属性,并且为这个属性的类型的编写了一个类型转换器,现在我们来看看这个类型转换器的代码,并解释一下这些代码的意义。
要实现一个类型转换器,我们必须要重写(
override
)四个方法:
CanConvertFrom
()――
根据类型参数进行测试,判断是否能从这个类型转换成当前类型
,
在本例中我们只提供转换
string
和
InstanceDescriptor
类型的能力
。
CanConvertTo
()――
根据类型参数进行测试,判断是否能从当前类型转换成指定的类型。
ConvertTo()
――
将参数
value
的值转换为指定的类型。
ConvertFrom
()――
串换参数
value
,并返回但书类型的一个对象。
public
override
object
ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture,
object
value, Type destinationType)
{
String result
=
""
;
if
(destinationType
==
typeof
(String))
{
Scope scope
=
(Scope)value;
result
=
scope.Min.ToString()
+
"
,
"
+
scope.Max.ToString();
return
result;
}
if
(destinationType
==
typeof
(InstanceDescriptor))
{
ConstructorInfo ci
=
typeof
(Scope).GetConstructor(
new
Type[]
{
typeof
(Int32),
typeof
(Int32) }
);
Scope scope
=
(Scope)value;
return
new
InstanceDescriptor(ci,
new
object
[]
{ scope.Min,scope.Max }
);
}
return
base
.ConvertTo(context, culture, value, destinationType);
}
上面是
ConvertTo
的实现,如果转换的目标类型是
string
,我将
Scope
的两个属性转换成
string
类型,并且用一个“,”连接起来,这就是我们在属性浏览器里看到的表现形式,如图:
如果转换的目标类型是实例描述器(
InstanceDescriptor
,它负责生成实例化的代码),我们需要构造一个实例描述器,构造实例描述器的时候,我们要利用反射机制获得
Scope
类的构造器信息,并在
new
的时候传入
Scope
实例的两个属性值。实例描述器会为我们生成这样的代码:
this.myListControl1.Scope = new CustomControlSample.Scope(10, 200)
;在最后不要忘记调用
base.ConvertTo(context, culture, value, destinationType)
,你不需要处理的转换类型,交给基类去做好了。
public
override
object
ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture,
object
value)
{
if
(value
is
string
)
{
String[] v
=
((String)value).Split(
'
,
'
);
if
(v.GetLength(
0
)
!=
2
)
{
throw
new
ArgumentException(
"
Invalid parameter format
"
);
}
Scope csf
=
new
Scope();
csf.Min
=
Convert.ToInt32(v[
0
]);
csf.Max
=
Convert.ToInt32(v[
1
]);
return
csf;
}
return
base
.ConvertFrom(context, culture, value);
}
}
上面是
ConvertFrom
的代码,由于系统能够直接将实例描述器转换为
Scope
类型,所以我们就没有必要再写代码,我们只需要关注如何将
String
(在属性浏览出现的属性值的表达)类型的值转换为
Scope
类型。没有很复杂的转换,只是将这个字符串以“,”分拆开,并串换为
Int32
类型,然后
new
一个
Scope
类的实例,将分拆后转换的两个整型值赋给
Scope
的实例,然后返回实例。在这段代码里,我们要判断一下用户设定的属性值是否有效。比如,如果用户在
Scope
属性那里输入了“
10200
”
,由于没有输入“,”,我们无法将属性的值分拆为两个字符串,也就无法进行下面的转换,所以,我们要抛出一个异常,通知用户重新输入。
posted @ 2006-12-14 21:45 纶巾客 阅读(7239) 评论(8)
编辑
公告
本博客上的所有文章如非特别说明均为原创,如果要转载请注明文章出处。
昵称:
纶巾客
园龄:
6年3个月
粉丝:
48
关注:
0
导航
博客园
首页
新随笔
联系
订阅
管理
<
2006年12月
>
日
一
二
三
四
五
六
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
统计
随笔 - 48
文章 - 0
评论 - 384
引用 - 116
搜索
常用链接
我的随笔
我的评论
我的参与
最新评论
我的标签
我的标签
Solr
(4)
全文检索
(4)
Lucene
(3)
随笔分类
(44)
.Net Framework(11)
(rss)
ASP.net(3)
(rss)
C#(4)
(rss)
Miscellaneous(3)
(rss)
NHibernate(2)
(rss)
Windows Workflow Foundation(1)
(rss)
WinForm Control(16)
(rss)
全文检索(4)
(rss)
随笔档案
(48)
2012年1月 (1)
2011年12月 (3)
2008年3月 (1)
2007年5月 (2)
2007年3月 (5)
2007年2月 (4)
2007年1月 (3)
2006年12月 (15)
2006年11月 (4)
2006年3月 (3)
2005年11月 (4)
2005年10月 (3)
文章分类
ASP.net
(rss)
JavaScript
(rss)
Visual C#
(rss)
Visual C++
(rss)
联系我
友情链接
积分与排名
积分 - 265322
排名 - 280
最新评论
阅读排行榜
评论排行榜
推荐排行榜