4

不適切な用語を使用したり、完全な初心者のように聞こえる場合は、ご容赦ください。

クラス ライブラリでサブルーチンを呼び出すときは、インスタンス化されたフォームではなく、フォームを表すクラスへの参照だけを渡したいと思います。次に、クラス ライブラリ関数内からフォームをインスタンス化します。これは可能ですか?

次のようなもの:

メインアプリケーションでは:

ClassLib.MyClass.DisplayForm(GetType(Form1))

次に、クラス ライブラリで次のようにします。

Public Class MyClass

    Public Shared Sub DisplayForm(WhichFormClass As Type)
        Dim MyForm as Form = WhichFormClass.CreateObject() 'Getting imaginitive
        MyForm.ShowDialog()
    End Sub

End Class

私の例が私が達成しようとしていることを伝えてくれることを願っています。私のアプローチが偽物だと思われる場合は、別の戦略を受け入れます。

4

2 に答える 2

6

Additionally to MotoSV's answer, here is a version that uses only generics:

Public Shared Sub DisplayForm(Of T As {New, Form})()
    Dim instance = New T()
    instance.ShowDialog()
End Sub

Which you can use like:

DisplayForm(Of Form1)()

With this approach you can be sure that the passed type is a form and that the instance has the ShowDialog() method. There is no cast necessary that might fail eventually. However, it is necessary to know the type parameter at design time in order to call the method.

于 2013-06-09T07:36:48.900 に答える
3

試す

Dim classType As Type = GetType(Form1)

次に、メソッドを呼び出します。

DisplayForm(classType)

次に、この型情報とリフレクションを使用して、実行時に DisplayForm メソッドでインスタンスを作成できます。

Activator.CreateInstance(classType)

これは単純な例であり、エラー チェックなどを実行しないことに注意してください。潜在的な問題を確実に処理するために、リフレクションについてもう少し読む必要があります。

編集1:

簡単な例:

Public Class MyClass

    Public Shared Sub DisplayForm(ByVal formType As Type)
        Dim form As Form = DirectCast(Activator.CreateInstance(formType), Form)
        form.ShowDialog()
    End Sub

End Class

メソッドは次のように使用します。

Dim formType As Type = GetType(Form1)
MyClass.DisplayForm(formType)

繰り返しますが、これらすべてでエラー チェックを実行することをお勧めします。

于 2013-06-09T07:07:47.890 に答える