创建实现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#]

None.gif using  System.ComponentModel;


[VB.NET]

None.gif Imports  System.ComponentModel


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

ExpandedBlockStart.gif ContractedBlock.gif public   class  ToolTip: Component, IExtenderProvider dot.gif {
ExpandedBlockEnd.gif}

None.gif

[VB.NET]

ExpandedBlockStart.gif ContractedBlock.gif Public   Class ToolTip Class ToolTip
InBlock.gif 
Inherits Component
InBlock.gif 
Implements IExtenderProvider
ExpandedBlockEnd.gif
End Class


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

None.gif [ProvideProperty(“ToolTip”,  typeof (Control))]
ExpandedBlockStart.gifContractedBlock.gif
public   class  ToolTip: Component, IExtenderProvider dot.gif {
ExpandedBlockEnd.gif}


 [VB.NET]

None.gif < ProvideProperty(“ToolTip”,  GetType (Control)) >  _
ExpandedBlockStart.gifContractedBlock.gif
Public   Class ToolTip Class ToolTip
InBlock.gif 
Inherits Component
InBlock.gif 
Implements IExtenderProvider
ExpandedBlockEnd.gif
End Class


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

ExpandedBlockStart.gif ContractedBlock.gif public   bool  CanExtend ( object  extendee)  dot.gif {
InBlock.gif
// more code here.
ExpandedBlockEnd.gif
}


[VB.NET]

ExpandedBlockStart.gif ContractedBlock.gif Public   Function CanExtend() Function CanExtend(extendee As ObjectAs Boolean
InBlock.gif 
'more code here.
ExpandedBlockEnd.gif
End Function


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

ExpandedBlockStart.gif ContractedBlock.gif public   string  GetToolTip(Control extendee)  dot.gif {
InBlock.gif
// more code here.
ExpandedBlockEnd.gif
}


[VB.NET]

ExpandedBlockStart.gif ContractedBlock.gif Public   Function GetToolTip() Function GetToolTip(extendee As Control) As String
InBlock.gif 
' more code here.
ExpandedBlockEnd.gif
End Function


Set PropertyName
[C#]

ExpandedBlockStart.gif ContractedBlock.gif public   void  SetToolTip(Control extendee,  string  value) dot.gif {
InBlock.gif
// more code here.
ExpandedBlockEnd.gif
}


[VB.NET]

ExpandedBlockStart.gif ContractedBlock.gif Public   Sub SetToolTip() Sub SetToolTip(extendee As Control, value As String)
InBlock.gif 
' more code here.
ExpandedBlockEnd.gif
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

转载于:https://www.cnblogs.com/zsi/archive/2004/11/21/66741.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值