Не перебирается коллекция элементов в GroupBox C++/CLI

Не могу понять, как перебрать все радиобаттоны в GroupBox. Попробовал сделать в C#-стайл:

for each (Control c in Age_GBox.Controls)
{
    MessageBox::Show(c.ToString());
}

Ругается на то, что .Controls возвращает System::Object^. Ок, поменял тип. Сделал так:

for each (System::Object ^ c in Age_GBox.Controls)
{
    MessageBox::Show(c.ToString());
}

Заработало, тип элементов выводит. Попытался на радостях получить доступ к свойству Checked да и вообще любому другом свойству. Не выходит, этот объект вообще не имеет никаких свойств, кроме стандартных вроде Clear, Add, ToString и пр. Что не так?


Ответы (1 шт):

Автор решения: αλεχολυτ

Очевидно, что если при итерации используется объект базового класса System::Object, то и методы у него будут доступны только этого класса. Если нужно вызвать метод какого-то производного класса, то сначала нужно убедиться, что объект реально соответствует этому классу, и уже после вызвать нужный метод. Делается это путём приведения типов. См. operator dynamic_cast:

RadioButton^ rb = dynamic_cast<RadioButton^>(c);
if (rb != nullptr) { 
   bool checked = rb->Checked(); 
}
→ Ссылка