我可以将类引用作为参数传递给 VB Net 中的函数吗?
Posted
技术标签:
【中文标题】我可以将类引用作为参数传递给 VB Net 中的函数吗?【英文标题】:Can I pass a class reference as a parameter to a function in VBNet? 【发布时间】:2013-06-05 02:56:51 【问题描述】:如果我使用了不当的术语或听起来像个菜鸟,请原谅我。
在类库中调用 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
希望我的示例传达了我想要完成的任务。如果您认为我的方法是虚假的,我对替代策略持开放态度。
【问题讨论】:
【参考方案1】:试试
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)
同样,最好在所有这些中执行一些错误检查。
【讨论】:
+1,但请务必将创建的实例转换为Form
而不是 Form1
。否则将类传递给方法没有任何意义。
这种方法看起来不错...可能不像 Nico 那样密封,但可能更灵活或适应其他用途。我一定会把这个放在我的工具包里。
@MotoSV - 同样的后续我问 Nico:我如何调整这种方法以便我可以为自定义表单的构造函数提供参数?如:Dim form As New MyForm(value)【参考方案2】:
除了 MotoSV 的回答,这里是一个只使用泛型的版本:
Public Shared Sub DisplayForm(Of T As New, Form)()
Dim instance = New T()
instance.ShowDialog()
End Sub
你可以像这样使用:
DisplayForm(Of Form1)()
通过这种方法,您可以确定传递的类型是一个表单,并且该实例具有ShowDialog()
方法。没有必要的演员最终可能会失败。但是,需要在设计时知道类型参数才能调用该方法。
【讨论】:
太棒了。由于您提到的优点,我喜欢这种方法的优雅。 Nico,如果我想将参数传递给 Form1 上的构造函数,我需要更改什么?我想做类似的事情: Dim instance = New T(IdNum) 这是不可能的。您必须使用反射来获取构造函数并调用它(类似于 MotoSV 的答案)。或者您可以创建一个具有必要属性的接口。并在使用默认构造函数创建实例后设置属性。 那么,使用您原来的方法,我猜测将参数发送到新表单实例的唯一方法是创建表单对象,为表单的 Tag 属性分配一个值,然后可能处理表单的激活事件中的那个值?这似乎有点笨拙,但也许它可以工作。 @BMB 泛型类型参数声明中的As
子句表示参数的约束。在这种情况下,有两个约束;这就是为什么大括号是必要的。 As New
指定该类型必须具有默认的无参数构造函数。 As Form
指定参数必须是Form
的子类。以上是关于我可以将类引用作为参数传递给 VB Net 中的函数吗?的主要内容,如果未能解决你的问题,请参考以下文章
下拉列表将参数传递给 vb.net 中的 webmethod