Как вы перебираете переменные-члены объекта? - PullRequest
2 голосов
/ 14 мая 2011

Я создаю небольшое консольное приложение, которое включает иерархию элементов управления - есть экраны, и внутри экранов вы можете создавать элементы управления вместе.

Вы можете добавить элементы управления на экран, объявив переменные-члены (которые все наследуют от 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 ]

2 голосов
/ 14 мая 2011

Вы можете сделать это с помощью отражения. В базовом классе:

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
0 голосов
/ 14 мая 2011

Конечно - добавьте методы к этому объекту, чтобы позволить вам то, что вы хотите, и скрыть детали. Я думаю, что это где инкапсуляция твой друг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...