枚举VB.NET项目中的所有表单,然后按名称或全名显示它们?

枚举VB.NET项目中的所有表单,然后按名称或全名显示它们?,vb.net,visual-studio-2012,windows-forms-designer,Vb.net,Visual Studio 2012,Windows Forms Designer,如何创建对表单的引用,只需通过其名称或.Fullname。。?这看起来很简单,但我试过的都不管用 根据下面的代码,最后的部分就是我被卡住的地方 谢谢 Public Class frmLauncher Private Sub FormPicker_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim myAssembly As System.Reflection.Assembly = System.Reflect

如何创建对表单的引用,只需通过其名称或.Fullname。。?这看起来很简单,但我试过的都不管用

根据下面的代码,最后的部分就是我被卡住的地方

谢谢

Public Class frmLauncher

Private Sub FormPicker_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    Dim myAssembly As System.Reflection.Assembly =  System.Reflection.Assembly.GetExecutingAssembly()
    Dim myTypes() As Type = Nothing

    ' Both of the following lines seem to do the same thing.
    ' Is one way better or safer than the other? 
    myTypes = myAssembly.DefinedTypes
    myTypes = myAssembly.GetTypes

    For Each t In myTypes
        If t.BaseType.FullName.ToString.ToUpper = "System.Windows.Forms.Form".ToUpper Then
            ListBox1.Items.Add(t.Name)
        End If
    Next

End Sub

Private Sub ListBox1_DoubleClick(sender As Object, e As EventArgs) Handles ListBox1.DoubleClick

    Dim frmName As String = ListBox1.Text

    ' the next line is where I'm totally stuck.
    Dim frm As Form = GetSomethingUnknown(frmName)  

    frm.Show()

End Sub

End Class

要创建表单实例,请首先将FullName属性添加到列表框中,这还包括您自己应用程序的名称空间,并且需要通过反射查找表单类

For Each t In myTypes
    If t.BaseType.FullName.ToString.ToUpper = "System.Windows.Forms.Form".ToUpper Then
        ListBox1.Items.Add(t.FullName)
    End If
Next
现在创建实例所需的代码如下

Private Sub ListBox1_DoubleClick(sender As Object, e As EventArgs) Handles ListBox1.DoubleClick

    Dim frmName As String = ListBox1.Text

    Dim myAssembly As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly()
    Dim obj = myAssembly.GetType(frmName).InvokeMember(Nothing, Reflection.BindingFlags.CreateInstance, Nothing, Nothing, Nothing)
    Dim frm As Form = CType(obj, System.Windows.Forms.Form)
    frm.Show()
End Sub

如您所见,这里的关键点是frmName变量标识的类型中的方法。这是一个复杂的方法,如果您真的想使用反射代码,您应该仔细研究它

表单只是一个类,因此您不会也无法创建对它的引用,但可以创建对从该类创建的实例(对象)的引用。我会暂时远离沉思。首先,它是相当复杂的,你不想冒险让它看起来像是你遇到的每一种情况的解决方案。一旦我有了表单列表,我就用这个列表生成代码来加载表单-好吧,快速而肮脏,当然不是动态的。寻找NimbleText,它是一个构建重复代码的有趣工具。谢谢。那很好用。正如我所指出的,我假设这样的事情一定会发生,比如GetMethod等等,但我不知道会发生什么。我查阅了InvokeMember,是的……我还有更多的学习要做。我将设置一些断点,然后四处搜索。我有几个后续问题。。。1) 在VBA中,“Variant”类型是所有内容的总括。这就是“obj”在这种情况下的工作原理吗?没有定义类型。2) 我的示例中的哪一行代码是首选的?myTypes=myAssembly.DefinedTypes myTypes=myAssembly.GetTypesSorry,我发现HTML编辑器没有很好地格式化我上面的任何评论。我希望你能过得很好。谢谢DefinedTypes是IEnumerable,而GetTypes返回类型数组。这两者之间有区别。第一个是IEnumerable,允许您立即启动循环,第二个需要您等待它完成在内存中构建整个数组。在您的上下文中,DefinedTypes更好,但如果这是一个交易撮合者,则取决于程序集中存在多少类型。对象与变体,我不是这方面的专家,但对于一般用途的任务,它们并不完全相同,我认为你可以将两者平衡好,我明白你的意思。如果是一个大型项目,GetTypes()可能需要一段时间。