我正试图掌握反射,因为我希望能够从我的程序集加载第三方程序集,从第三方程序集动态创建控件,然后以我创建的形式显示它。
我已经阅读了msdn文档,博客文章,谷歌搜索结果等,并通过实验得到了这一点。在下面的代码中,acmeccontrols是第三方Assembly,而AcmeLabel是我希望创建的控件,它具有一个带有get和set的Text属性。我确切地知道第三方程序集将在哪里找到,因此有一个单独的函数来确定它(为了清晰起见,下面没有显示)。
Public Sub CreateDynamicLabelViaReflection()
Dim type As System.Type
Dim asm As Assembly = Assembly.LoadFrom(GetAssemblyName("AcmeControls.dll"))
Dim obj As System.Object
type = asm.GetType("AcmeControls.AcmeLabel")
obj = Activator.CreateInstance(type, New Object() {})
Dim textProp As PropertyInfo = type.GetProperty("Text")
Dim textPropSet As MethodInfo = textProp.GetSetMethod
Dim newAl As Object = Activator.CreateInstance(type)
textPropSet.Invoke(newAl, New Object() {"here is my text"})
Dim frm As New Form With {.Text = "Hello"}
frm.Controls.Add(newAl)
frm.Show()
For Each ctrl As Control In frm.Controls
MessageBox.Show(ctrl.Location.ToString) 'ctrl.GetType.ToString here returns AcmeLabel
Next
End Sub
然后我有一个单独的项目,引用该代码所在的程序集,并在该项目中的按钮单击事件中调用createddynamiclabelviareflection()。
我最终得到的是一个表单,但没有明显的迹象表明AcmeLabel存在于表单上。然而,它也没有抛出任何错误,所以我假设这段代码可能部分工作,这导致我在底部添加For each循环。当然,在表单控件集合中有一个控件,它是一个AcmeLabel(位置X = 0, y = 0),但是我不能看到它或理论上我早先添加到它的文本。
我显然错过了一个重要的步骤,但我不确定这一步是什么,有人能帮助我更好地理解这个过程吗?
谢谢
在您的代码中更改此更改
Dim frm As New Form With {.Text = "Hello"}
frm.Controls.Add(newAl)
newA1.visible=true
frm.Show()