我将为此忽略命名空间。如果您愿意,可以添加它。但是这个函数做了你的函数声称要做的事情。
Public Function getAllTypesOfControl(assembly As Assembly) As IEnumerable(Of Type)
Return assembly.GetTypes().
Where(Function(t) t.IsSubclassOf(GetType(ContainerControl))).
SelectMany(Function(container) container.GetFields(BindingFlags.Instance Or BindingFlags.NonPublic Or BindingFlags.Public)).
Where(Function(f) f.FieldType.IsSubclassOf(GetType(Control))).
Select(Function(f) f.FieldType)
End Function
现在,您留下了在控件中定义的所有控件的所有类型,这些控件是 ContainerControls。正如您所提到的,这应该包括在 Forms 和 UserControls 中定义的控件。
你能用这个做点什么吗?我不这么认为,因为您希望访问控件的实例。要做到这一点,您不应该处理大会制度,而是您的 runtime,它应该具有您的实例化控件。我想?
您可能想查看Application.OpenForms,并迭代所有打开的表单,并返回所有控件。
Public Function getAllInstantiatedControls() As IEnumerable(Of Control)
Return Application.OpenForms.Cast(Of Form).
SelectMany(Function(openForm) openForm.Controls.Cast(Of Control)().
Select(Function(c) c.Controls.Cast(Of Control).Append(c))).
SelectMany(Function(c) c)
End Function
您可能想要第二个,因为您不能只对类型进行操作,因为我知道您想要存储控件属性。所以让我分解你的问题。 You said
...[表单中的组件] 存储在我的项目中,我可以轻松查看/修改它们的详细信息...
是的,但是您知道这些详细信息是如何存储的吗?实际上,它们不是存储的,而是在构造表单时设置的。实际上,Visual Studio 需要运行 InitializeComponent 以便向您展示设计器 - 每次您对控件进行更改时。所以细节实际上是这样存储的(在设计器代码 Form1.Designer.vb 中),上面有一个名为 Button1 的按钮。
设计
Form1.Designer.vb
Partial Class Form1
Inherits System.Windows.Forms.Form
Public Sub New()
InitializeComponent()
End Sub
Private Sub InitializeComponent()
' ...
Me.Button1 = New System.Windows.Forms.Button()
'
'Button1
'
Me.Button1.Location = New System.Drawing.Point(157, 103)
Me.Button1.Name = "Button1"
Me.Button1.Size = New System.Drawing.Size(75, 23)
Me.Button1.TabIndex = 3
Me.Button1.Text = "Button1"
Me.Button1.UseVisualStyleBackColor = True
'
'Form1
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(203, 114)
Me.Controls.Add(Me.Button1)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)
End Sub
Friend WithEvents Button1 As Button
End Class
您可以修改或删除该按钮,然后观察 Form1.Designer.vb 中的代码更改或消失。因此,您的“详细信息”存储在代码中。这就是 Visual Basic 中的“Visual”在幕后的含义。
所以这些细节只有在你运行 InitializeComponent 时才会设置,这意味着它们有两种设置方式:
- 在 Visual Studio Form1 设计视图中
- 当应用程序运行并创建 Form1 实例时
除了这两种方式之外,控件属性没有你的值,并且只有默认值(但这确实是一种不可能的情况并且相关性值得怀疑)。
了解这一点后,您必须访问控件的实例,这可以通过 Application.OpenForms 选项实现。我认为您可以加载所有控件,并写入一些设置文件或数据库,还可以读取并查找控件并根据设置文件或数据库更新它们。不过我不是这么写的。我想我回答了你的问题。