Применяется ли эта логика к каждому Label
в форме? Если так, то вы можете найти их динамически в коллекции Controls
. Возможно, что-то вроде этого:
foreach (var label in this.Controls)
if (label is Label)
if (player.Bounds.IntersectsWith((label as Label).Bounds))
{
MessageBox.Show("hi");
break;
}
или без петель и вложенности:
if (this.Controls.Where(c => c is Label).Any(c => player.Bounds.IntersectsWith((c as Label).Bounds)))
MessageBox.Show("hi");
Или, если существует только подмножество меток, к которым это относится, вы можете явно сохранить их в коллекции класса (возможно, в конструкторе) и затем выполнить цикл по этой коллекции. Та же логика, но вы перебираете свою коллекцию вместо this.Controls
.
В зависимости от того, насколько вы хотите абстрагироваться, другим вариантом может быть создание собственного класса (возможно, называемого чем-то вроде IntersectableLabel
), который наследуется от Label
. Сделайте все ваши соответствующие экземпляры меток этого класса вместо Label
. (Честно говоря, я не уверен, какое влияние это может оказать на конструктор форм. Прошло очень много времени с тех пор, как я использовал Windows Forms.) Затем вы можете перебрать this.Controls
и искать is IntersectableLabel
, что приведет к фильтрации любые ярлыки, которые вы не хотите использовать.
Обратите внимание, что если ваши ярлыки когда-либо вложены в другие элементы управления, вам может потребоваться рекурсивная функция вместо простого цикла.