我正在试图掌握反射,因为我希望能够从我的程序集中加载第三方程序集,从该第三方程序集动态创建一个控件,然后以我创建的形式显示它。
我已经阅读了msdn文档,博客文章,谷歌搜索结果等的各种内容,并通过实验得到了这一点。在下面的代码中,AcmeControls是第三方程序集,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
然后我有一个单独的项目引用该代码所在的程序集,并在该项目中的按钮单击事件中调用CreateDynamicLabelViaReflection()。
我最终得到的是一张表格,但没有明显迹象表明AcmeLabel存在于表格上。但是它也没有抛出任何错误所以我假设这个代码可能部分工作,这导致我在底部添加For each循环。果然,表单控件集合中有一个控件,它是一个AcmeLabel(位置X = 0,y = 0)。但是,我无法看到它或理论上我之前添加的文本。
我显然错过了某个重要的步骤,但我不确定这一步是什么,有人可以帮助我更好地理解这个过程吗?
由于
答案 0 :(得分:0)
在你的代码中制作这个chanc = ge
Dim frm As New Form With {.Text = "Hello"}
frm.Controls.Add(newAl)
newA1.visible=true
frm.Show()