カスタムコントロールクラスを複数作っており、
それをコントロール型の引数に渡し、関数内でDirectCastした後、カスタムコントロールに実装したメソッドを呼んでいます。
カスタムコントロールの名前は、各基底クラス名の頭に「Custom」を付けています。
現在以下のようなコードでまかなっています。
Ctrl:コントロール型の変数
DoEnter:カスタムコントロールに実装したメソッド
Select Case True
Case (TypeOf Ctrl Is CustomButton)
DirectCast(Ctrl, CustomButton).DoEnter()
Case (TypeOf Ctrl Is CustomTextBox)
DirectCast(Ctrl, CustomTextBox).DoEnter()
Case (TypeOf Ctrl Is CustomComboBox)
DirectCast(Ctrl, CustomComboBox).DoEnter()
Case (TypeOf Ctrl Is CustomCheckBox)
DirectCast(Ctrl, CustomCheckBox).DoEnter()
Case (TypeOf Ctrl Is CustomRadioButton)
DirectCast(Ctrl, CustomRadioButton).DoEnter()
End Select
しかし今後、特定の入力(日付の入力用など)に特化した新たなカスタムコントロールを作った場合、その度にわざわざ上のSelectCaseに追加しなくてはならなくなります。
そこで、コントロール型変数の中身の型を調べ、その型にキャストするような方法はないでしょうか?
イメージ的には以下の通りです。
Dim T As Type = Ctrl.GetType
DirectCast(Ctrl, T).DoEnter()
しかしDirectCastの第二引数は変数にすることが出来ず、上記のコードはコンパイルエラーになります。
なので仕方なく今はSelectCaseで分岐させています。
何か方法がありそうな気はするのですが、行き詰ってしまいました。
もし動的キャストの方法があれば、ヒントでもかまいませんのでお教えいただけないでしょうか?
よろしくお願いします。
そもそも,コントロールの型を知る必要があるのですか?
DoEnterを持つインターフェースを用意して,
対象コントロールはすべてそのインターフェースを実装するようにしてやれば,
コントロールをそのインターフェースにキャストするだけで済みます。
実はDoEnterだけではなく、以下のようなこともしています。
Select Case True
Case (TypeOf Ctrl Is CustomCheckBox)
DirectCast(Ctrl, CustomCheckBox).Checked = True
Case (TypeOf Ctrl Is CustomRadioButton)
DirectCast(Ctrl, CustomRadioButton).Checked = True
End Select
なので、汎用的な作りにしたいと思っているのです。
その為にはやはり動的にキャストが出来たらいいと思っています。
> 実はDoEnterだけではなく、以下のようなこともしています。
で?
各型に固有の処理を,DoEnterなり別の名前なりをつけたメソッドで行えば良いだけですよね。
つまり,
Public Interface IFoo
Sub Bar ()
End Interface
を用意して,
Public Class CustomButton
Inherits Button
Implements IFoo
Public Sub Bar () Implements IFoo.Bar
DoEnter()
End Sub
End Class
とか,
Public Class CustomCheckBox
Inherits CheckBox
Implements IFoo
Pulbic Sub Bar () Implements IFoo.Bar
DoEnter()
Checked - True
End Sub
End Class
とかすればいいわけです。
どうやら、動的にDirectCastすることに固執しすぎていたようです。
YuOさん、どうもありがとうございました。
その方法でやってみます。