创建实现IExtenderProvider接口的自定义类

Why IExtenderProvider

        通过实现IExtenderProvider接口,Control可以将自身的属性扩展给其它Control,从而为应用程序提供更丰富、更快捷、更强大的设计时和运行时表现能力。

What is IExtenderProvider

        IExtenderProvider是定义将属性扩展到其它Control的接口。IExtenderProvider只有一个方法成员CanExtend,返回布尔值类型。
        .net中实现IExtenderProvider的类有ComponentTray、ErrorProvider、HelpProvider、LocalizationExtenderProvider、PropertyTab和ToolTip。在Windows Forms设计中,经常用到类有ErrorProvider和ToolTip。
        关于IExtenderProvider更详细的信息,请查看MSDN帮助。
        ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemcomponentmodeliextenderproviderclasstopic.htm

How to use IExtenderProvider


         要创建自定义IExtenderProvider扩展类,需要经过下面几步,为了能更明确的指明要点,文章使用ToolTip为例介绍它是如何实现IExtenderProvider的:
        1. 引用System.ComponentModel命名空间;
 [C#]

using System.ComponentModel;


[VB.NET]

Imports System.ComponentModel


        2. 在自定义类中实现IExtenderProvider接口;
[C#]

public class ToolTip: Component, IExtenderProvider{
}

[VB.NET]

Public Class ToolTip
 
Inherits Component
 
Implements IExtenderProvider
End Class


        3. 使用ProvideProperty 的Attribute特性对外部公开扩展属性;
[C#]

[ProvideProperty(“ToolTip”, typeof(Control))]
public class ToolTip: Component, IExtenderProvider{
}


 [VB.NET]

<ProvideProperty(“ToolTip”, GetType(Control))> _
Public Class ToolTip
 
Inherits Component
 
Implements IExtenderProvider
End Class


        4. 实现IExtenderProvider接口的CanExtend方法,定义可以被扩展的Control的类型;
[C#]

public bool CanExtend (object extendee) {
// more code here.
}


[VB.NET]

Public Function CanExtend(extendee As ObjectAs Boolean
 
'more code here.
End Function


        5. 实现对外公开的属性。
Get PropertyName
[C#]

public string GetToolTip(Control extendee) {
// more code here.
}


[VB.NET]

Public Function GetToolTip(extendee As Control) As String
 
' more code here.
End Function


Set PropertyName
[C#]

public void SetToolTip(Control extendee, string value){
// more code here.
}


[VB.NET]

Public Sub SetToolTip(extendee As Control, value As String)
 
' more code here.
End Sub


         这里的PropertyName必须与在第3中ProvideProperty公开的属性名相同。可以看到,属性不是通过get/set构造块实现的,而是代之以方法。这有点像Java中实现属性的方式。
get方法中返回的类型和set方法中value的类型是和自定义类要扩展的属性的类型一致的。可以是字符型、数值型,甚至可以是枚举类型。

Conclusion

         在创建自己的IExtenderProvider类的过程中,进行了很多尝试,也走了不少弯路,最后总结出下面几个建议。需要声明的是,这些建议不是强迫性的规定,也不是微软对实现IExtenderProvider接口的官方建议(至少现在我没有找到相关资料),但是依照该建议的原则,可以使您的自定义控件有更好的可读性和可维护性。
        关于实现IExtenderProvider接口的建议如下:
        1. 实现IExtenderProvider的类应是独立的,它只应继承自Component,而不是其它控件;
        2. 实现IExtenderProvider的类在返回CanExtend时应尽量排除自己,即不应将自己也做为可被扩展的对象;
        3. 实现IExtenderProvider的类提供的扩展属性应该是明了的、自解释的;
        4. 实现IExtenderProvider的类中所有被扩展Control的引用应尽量使用extendee变量表示。

参考资料

        1. MSDN Library for .NET 2003,
        2. Building Windows Forms Controls and Components with Rich Design-Time Features,Michael Weinhardt and Chris Sells
        3. Reflector for .NET,Lutz Roeder

posted on 2004-11-21 22:38  zsi  阅读(1524)  评论(0编辑  收藏  举报