创建实现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#]
[VB.NET]
2. 在自定义类中实现IExtenderProvider接口;
[C#]
}
[VB.NET]
Inherits Component
Implements IExtenderProvider
End Class
3. 使用ProvideProperty 的Attribute特性对外部公开扩展属性;
[C#]
public class ToolTip: Component, IExtenderProvider{
}
[VB.NET]
Public Class ToolTip
Inherits Component
Implements IExtenderProvider
End Class
4. 实现IExtenderProvider接口的CanExtend方法,定义可以被扩展的Control的类型;
[C#]
// more code here.
}
[VB.NET]
'more code here.
End Function
5. 实现对外公开的属性。
Get PropertyName
[C#]
// more code here.
}
[VB.NET]
' more code here.
End Function
Set PropertyName
[C#]
// more code here.
}
[VB.NET]
' 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