如果我使用不正确的术语或听起来像一个完整的菜鸟,请原谅我。
在类库中调用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
希望我的例子传达了我想要完成的事情。如果你认为我的做法是假的,我会接受其他策略。
答案 0 :(得分:5)
除了MotoSV的答案之外,这里还有一个仅使用泛型的版本:
Public Shared Sub DisplayForm(Of T As {New, Form})()
Dim instance = New T()
instance.ShowDialog()
End Sub
您可以使用:
DisplayForm(Of Form1)()
使用这种方法,您可以确保传递的类型是表单,并且实例具有ShowDialog()
方法。没有必要的演员可能最终失败。但是,有必要在设计时知道类型参数以调用方法。
答案 1 :(得分: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)
同样,最好在所有这些中执行一些错误检查。