拡張プロバイダー オブジェクト
拡張プロバイダーは、他のコンポーネントにプロパティを提供するコンポーネントです。たとえば、フォームに ToolTip コンポーネント (Windows フォーム) を追加すると、そのフォーム上の各コントロールに 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 プロパティは実際には MyToolTip によって提供されており、コンパイルはこのプロパティを MyButton のプロパティとして認識しないため、この構文ではコンパイル エラーが発生します。このプロパティに正しくアクセスする方法の例を次に示します。
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 という 1 つのメソッドから構成されています。このメソッドはブール値を返して、コンポーネントが拡張対象かどうかをデザイナーに示します。たとえば、コントロールだけにプロパティを提供するエクステンダーを作成するとします。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;
}