4

如果我使用了不恰当的术语或听起来像一个完整的菜鸟,请原谅我。

在类库中调用 sub 时,我不想传递实例化的表单,而只是传递对表示表单的类的引用。然后我想从类库函数中实例化表单。这可能吗?

类似于以下内容:

在主应用程序中:

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

除了 MotoSV 的回答,这里是一个只使用泛型的版本:

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

您可以使用如下:

DisplayForm(Of Form1)()

使用这种方法,您可以确保传递的类型是表单并且实例具有该ShowDialog()方法。没有必要的演员最终可能会失败。但是,在设计时必须知道类型参数才能调用该方法。

于 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 回答