我可以将类引用作为参数传递给 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

是否可以将类类型的对象作为参数传递给另一个类,这样我就不必再次初始化? (Python 3.x)

试图将类作为参数传递给不同的类构造函数,但出现“转换”错误

如何将类对象作为参数传递给不同的类方法?

将类作为参数传递给方法,然后调用静态方法

如何将类方法作为参数传递给该类外部的函数?