为什么我看不到通过反射动态创建的控件

时间:2014-07-19 14:09:25

标签: .net vb.net reflection

我正在试图掌握反射,因为我希望能够从我的程序集中加载第三方程序集,从该第三方程序集动态创建一个控件,然后以我创建的形式显示它。

我已经阅读了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)。但是,我无法看到它或理论上我之前添加的文本。

我显然错过了某个重要的步骤,但我不确定这一步是什么,有人可以帮助我更好地理解这个过程吗?

由于

1 个答案:

答案 0 :(得分:0)

在你的代码中制作这个chanc = ge

   Dim frm As New Form With {.Text = "Hello"}
   frm.Controls.Add(newAl)
   newA1.visible=true
   frm.Show()