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