Control型の変数を動的にDirectCastできないでしょうか?

解決


ライト  2008-12-11 23:22:02  No: 145478

カスタムコントロールクラスを複数作っており、
それをコントロール型の引数に渡し、関数内で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で分岐させています。
何か方法がありそうな気はするのですが、行き詰ってしまいました。
もし動的キャストの方法があれば、ヒントでもかまいませんのでお教えいただけないでしょうか?
よろしくお願いします。


YuO  2008-12-11 23:52:17  No: 145479

そもそも,コントロールの型を知る必要があるのですか?

DoEnterを持つインターフェースを用意して,
対象コントロールはすべてそのインターフェースを実装するようにしてやれば,
コントロールをそのインターフェースにキャストするだけで済みます。


ライト  2008-12-12 00:35:11  No: 145480

実は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

なので、汎用的な作りにしたいと思っているのです。
その為にはやはり動的にキャストが出来たらいいと思っています。


YuO  2008-12-12 01:30:09  No: 145481

> 実は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
とかすればいいわけです。


ライト  2008-12-12 02:38:40  No: 145482

どうやら、動的にDirectCastすることに固執しすぎていたようです。
YuOさん、どうもありがとうございました。
その方法でやってみます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加