如何遍历对象的成员变量?

时间:2011-05-14 14:14:06

标签: c# .net vb.net reflection

我正在构建一个涉及控制层次结构的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

我想自动将控件添加到基类中的集合中。这就是我的想法:

  • 使用反射迭代成员变量
  • 拉出从AresControl继承的那些
  • 将它们添加到集合

这将产生更清晰,基于约定的代码。但是尽量尝试,我不能让它工作 - 我可以走一个类型的成员变量,但我需要走一个活动对象的成员变量。

可能,对吧?

2 个答案:

答案 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)

当然 - 向该对象添加方法以允许您获得所需内容并隐藏详细信息。我认为这是封装是你朋友的地方。