Dotnet专业组件开发揭密(三)
--TypeDescriptor内部机制及其应用(中)
本文代码下载
官方地地://Code/Csharp/BlogCode/TypeDescriptionProviderDemo.rar
CSDN地址:http://download.csdn.net/user/BlueDog
上一篇我们讲到了如何利用ICustomTypeDescriptor来使PropertyGrid所看到的类属性动态变化,并且实现了一个将原来不能在PropertyGrid显示的类字段当作类属性显示出来的一个小程序。我们也讲到那是1.0里的做法,2.0里并不推荐使用,那么2.0里的方法应该是如何的。
首先我们来看1.0里的做法有些什么样的问题,首先是职责不清,不符合设计模式的观点,一个类既要实现它本有的功能,又要实现如何在PropertyGrid里实示,从软件设计的角度来看是相当不合理的(不过上一篇提出的代理类的方法倒是可以解决这个问题);其次是性能问题,为了实现这个目的,你的功能类要多出很多对象,从而提高性能,但是这样子做,无形中你的功能类负担太重了,而且更重要是因为每次需要通过反射和相关的处理来取得类信息,因此性能也不是很好。正是基于这两个原因,MS在2.0里提出了新的解决办法。
2.0里你还可以通地上一篇介绍的方法使用来达到你的目的,不过更好的是使用一个新类TypeDescriptionProvider以及一个辅助属性类TypeDescriptionProviderAttribute,它们可以解决上面的两个问题。
同样的你还是需要实现一个属性描述符类,我们借用上一篇的FieldPropertyDescriptor类,还需要实现一个用户自定的TypeDescriptor,2.0里你不需要从IcustomTypeDescirptor继承了,建议从CustomTypeDescriptor虚基类继承,你可以少写很多代码,我们实现了一个跟上一篇类似的FieldToPropertyTypeDescriptor类,但是它也有几点不同,首先它不再是一个虚基类,用户的功能类也不需要从此类继承,更多的,它象上一篇里的FieldToPropertyProxyTypeDescriptor这个类,最后你只要简单实现一个从TypeDescriptionProvider继承的类,它的作用就是返回一个提供者就可以了。
上面的阐述可能你会有点晕,我们还是来看看这张图,它显示了2.0里PropertyGrid如何来显示一个类的属性
下面的图是是DEMO代码的运行界面,它除了一个PropertyGrid外,还多了两个按钮,可以删除和增加提供者,同时你可以看到PropertyGrid的变化。
最后需要提醒大家一句的是,真正用到TypeDescriptionProvider的地方并不多,也只是在PropertyGrid里显示时用一下。很多控件的通用显示还是通过查看类是否实现了ICustomTypeDescriptor接口来决定显示类的信息,比如我们2.0里常用的DataGridView控件,它支持显示实现的ICustomTypeDescriptor接口的类实例。这个大家可以按上一篇介绍的方法自已试一试。
在下一篇里我们将通过Reflector来探索TypeDescriptor的内部机制。
参考文档:MSDN Magazine关于ICustomTypeDescriptor的文章(http://msdn.microsoft.com/msdnmag/issues/05/05/NETMatters/)。