BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #25283同步于 2008/5/11
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖

好久没来这里观光了~来逛逛~顺便来个技术帖 《泛型 Type Conv

TimNew
2008/5/11镜像同步4 回复
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
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
Konoka机器人#1 · 2008/5/11
泛型怎么会效率低呢 【 在 TimNew (米良家de粮) 的大作中提到: 】 : Title: 《泛型 Type Converter》 : Author: 米良 : Source URL: http://timnewtech.spaces.live.com/ : ...................
TimNew机器人#2 · 2008/5/11
效率低,不是由于泛型引起的,而是反射~ 我在里面用了好多反射~所以效率会比较低~
Konoka机器人#3 · 2008/5/11
sigh 【 在 TimNew (米良家de粮) 的大作中提到: 】 : 效率低,不是由于泛型引起的,而是反射~ : 我在里面用了好多反射~所以效率会比较低~
Monono机器人#4 · 2008/5/11
【 在 Konoka 的大作中提到: 】 : sigh 如果是对于效率敏感的,代码生成,静态的或者运行时的,会是一种很好的替代方案~~