返回信息流Title: 《泛型 Type Converter》
Author: 米良
Source URL: http://timnewtech.spaces.live.com/
今天做控件时给控件加了一个自定义类型的属性,结果在 Property Grid 里没法展开编辑该类型。解决办法就是写一个 Type Converter。
突然觉得这样很烦,前几天才弄了几个 Type Converter, 今天又要写~
只要想在 Property Grid 中使用 自定义类型 就得为其编写 Type Converter。而且需要为子类型的每个 Property 编写 Property Descriptor,遇到像我几天这种属性很多的自定义类型,能把人玩儿死~
一怒之下写了一个 Generic 版本的 Type Converter,叫做 GenericSubPropertyTypeConverter<T>, 专门负责展展开 自定义类型的 Property。
Type Converter 在构造函数里面 反射 枚举对象实例属性,当然是 Flatten Hierarchy 以后,因为继承属性也是需要编辑的嘛。
然后从中排除掉那些标记了 Browsable(false) 的属性。
然后为每一个 属性创建一个 GenericPropertyDescriptor,并将相应的 PropertyInfo 传给 Generic Property Descriptor。
由于 GenericPropertyDescriptor 还是 TypeConverter.SimplePropertyDescriptor 的子类,因此 GenericPropertyDescriptor 实际上只需要负责完成 GetValue 和 SetValue 的动作即可。而 GetValue 和 SetValue 的操作可以委托给 PropertyInfo 去具体完成。
值得一提的是在 GenericPropertyDescriptor 构造的时候需要完成 SimplePropertyDescriptor 的构造,因此需要知道 属性的 Owner 的类型,属性的名字以及属性的类型。
属性的名字和属性的类型很好办,因为 PropertyInfo 都有相关信息,直接使用就好。
至于 属性 Owner 的类型 其实也很好办,因为GenericPropertyDescriptor 是 GenericSubPropertyTypeConverter<T> 的 Nested Class,因此 GenericPropertyDescriptor 中可以得知自定义类型的泛型参数 T。那 Owner 的类型其实就是 T。
于是一个 泛型的 Type Converter 就这样诞生了。虽然效率低了点,但是却省去了写大量枯燥乏味的代码的麻烦~何乐而不为呢~
Technorati Tags: Type Converter,.net,C#,Component Model,Generic,Reflect
这是一条镜像帖。来源:北邮人论坛 / soft-design / #25283同步于 2008/5/11
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖
好久没来这里观光了~来逛逛~顺便来个技术帖 《泛型 Type Conv
TimNew
2008/5/11镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
泛型怎么会效率低呢
【 在 TimNew (米良家de粮) 的大作中提到: 】
: Title: 《泛型 Type Converter》
: Author: 米良
: Source URL: http://timnewtech.spaces.live.com/
: ...................
sigh
【 在 TimNew (米良家de粮) 的大作中提到: 】
: 效率低,不是由于泛型引起的,而是反射~
: 我在里面用了好多反射~所以效率会比较低~