扩展程序提供程序对象
“扩展程序提供程序”是一种为其他组件提供属性的组件。例如,将一个 ToolTip 组件添加到一个窗体后,该组件将向该窗体上的每个控件提供名为 ToolTip 的属性。这个 ToolTip 属性然后会出现在每个控件的**“属性”**窗口中,开发人员在设计时可以设置该属性的值。
扩展程序提供程序提供的属性实际驻留在扩展程序提供程序对象本身,因此并不是它修改的组件的真正属性。在设计时,该属性将出现在被修改的组件的**“属性”**窗口中。但在运行时,无法通过组件本身访问属性。下面的代码示例中创建了一个窗体,该窗体包含一个名为 MyButton 的按钮和一个名为 MyToolTip 并提供 ToolTip 属性的 ToolTip 控件。
' This is an example of code that is NOT CORRECT!
Dim myString as String
myString = MyButton.ToolTip
// This is an example of code that is NOT CORRECT!
string myString;
myString = MyButton.ToolTip;
此语法将产生一个编译错误,因为编译器不将 ToolTip 识别为 MyButton 的属性,这是因为该属性实际上是由 MyToolTip 提供的。下面的示例显示如何访问该属性:
Dim myString as String
myString = MyToolTip.GetToolTip(MyButton)
string myString;
myString = MyToolTip.GetToolTip(MyButton);
扩展程序提供程序是一个类,因此可以有它自己的属性和方法。为了将某个属性指定为提供给其他组件的属性,应在类级别应用 ProvidePropertyAttribute 特性。此特性指定要提供的属性名和它能将该属性提供给的对象类型。按照约定,提供的属性不作为属性实现,而是作为方法对实现。这些方法必须将“Get”和“Set”添加到要提供的属性名开头。下面的示例显示如何做。
Imports System.ComponentModel
<ProvideProperty("MyText", GetType(Control))> Public Class MyExtender
<ExtenderProvidedProperty()> Public Function GetMyText(acontrol as _
Control) as String
' Insert code to implement function.
End Function
Public Sub SetMytext (acontrol as Control)
' Insert code to implement function.
End Function
End Class
using System.ComponentModel;
[ProvideProperty("MyText", typeof("Control"))]
public class MyExtender
{
[ExtenderProvidedProperty()]
public string GetMyText(Control acontrol)
{
// Insert code to implement method.
}
public void SetMyText(Control acontrol)
{
// Insert code to implement method.
}
}
实现提供的属性需要 Hashtable 或者其他一些这样的集合对象来记录和检索每个控件的属性值。有关详细信息,请参见 如何:实现扩展程序提供程序。
每个扩展程序类还必须实现 IExtenderProvider 接口。该接口由一个单独的方法 CanExtend 组成,此方法返回一个布尔值并向设计人员指出某个组件是不是要扩展的候选对象。例如,您可能希望创建一个只为控件提供属性的扩展程序。下面的示例显示如何实现 CanExtend 方法:
Imports System.ComponentModel
Public Function CanExtend(ByVal extendee As Object) As Boolean _
Implements IExtenderProvider.CanExtend
If Typeof extendee Is Control Then
Return True
Else
Return False
End If
End Function
public bool CanExtend(object extendee)
{
if (extendee is Control)
return true;
else
return false;
}