Некоторые формы в моем проекте наследуются от базовой формы. Получить доступ к коллекции Controls производных форм легко, но я не нашел простого способа получить доступ к коллекции Components, поскольку VS помечает ее как частную.
Я предполагаю, что это можно сделать с помощью отражения, но я не совсем уверен, как лучше всего это сделать, потому что раньше не работал с отражением.
Прямо сейчас я использую своего рода неуклюжий обходной путь, в котором я переопределяю функцию GetComponents и возвращаю массив компонентов, которые меня интересуют. Это, очевидно, подвержено ошибкам, поскольку легко забыть реализовать переопределенную функцию или обновите его при добавлении компонентов.
Если у кого-то есть какие-то советы или можно предложить лучший способ, я был бы рад услышать.





Если вы беспокоитесь о том, что забыли переопределить функцию, сделайте ее абстрактной.
Если вы установите для свойства Modifiers ваших компонентов значение strict protected, чтобы сделать их доступными без использования коллекции компонентов.
Редактировать: Обнаружение можно сделать с помощью отражения для обхода каждого поля. Хотя в вашем случае это может быть неоптимально.
Установите для модификатора 'components' значение protected в вашем базовом классе формы. Удалите объявление «компоненты» во всех производных формах.
Вызовите этот метод ниже в событии загрузки базовой формы,
public void SetComponentsStyle()
{
if (null != this.components)
{
foreach (Component comp in this.components.Components)
{
if (comp is ToolTip)
{
}
else if (comp is ContextMenuStrip)
{
}
}
}
}