我正在构建一个涉及控制层次结构的litle控制台应用程序 - 有屏幕,屏幕内部可以组合控件。
您可以通过声明成员变量(全部继承自AresControl)来向屏幕添加控件。控制构造函数采用简单的坐标对。它看起来像这样:
Public Class IntroScreen : Inherits AresScreen
'Controls
Private LabelSelect As New LabelControl(72, 0)
Private Stats As New StatAreaControl(2, 2)
Private Messages As New MessageAreaControl(22, 45) With {.ListeningForKeys = True}
然后,在OnLoad事件中,您必须将所有这些控件添加到集合中,以便稍后迭代它们并进行渲染等等:
Public Sub Screen_Load() Handles MyBase.OnLoad
MyBase.Controls.Add(LabelSelect)
MyBase.Controls.Add(Stats)
MyBase.Controls.Add(Messages)
End Sub
我想自动将控件添加到基类中的集合中。这就是我的想法:
这将产生更清晰,基于约定的代码。但是尽量尝试,我不能让它工作 - 我可以走一个类型的成员变量,但我需要走一个活动对象的成员变量。
这 可能,对吧?
答案 0 :(得分:2)
你可以使用反射来做到这一点。在基类中:
Public Sub DoLoad()
Dim controls = Me.GetType.GetFields(BindingFlags.Instance Or BindingFlags.NonPublic) _
.Where(Function(f) f.FieldType.IsSubclassOf(GetType(AresControl))) _
.Select(Function(f) f.GetValue(Me)).Cast(Of AresControl)()
For Each c In controls
Me.Controls.Add(c)
Next
End Sub
答案 1 :(得分:0)
当然 - 向该对象添加方法以允许您获得所需内容并隐藏详细信息。我认为这是封装是你朋友的地方。