【问题标题】:Can I pass a class reference as a parameter to a function in VBNet?我可以将类引用作为参数传递给 VB Net 中的函数吗?
【发布时间】: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

希望我的示例传达了我想要完成的任务。如果您认为我的方法是虚假的,我对替代策略持开放态度。

【问题讨论】:

    标签: vb.net vb.net-2010


    【解决方案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 的子类。
    猜你喜欢
    • 2023-04-01
    • 2020-10-02
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多