VisualStudio 2010 Designer бросает реализованный виртуальный метод

Я хочу иметь абстрактный UserControl , BaseControl , реализующий интерфейс IBaseControl . Однако установка абстрактного класса нарушает работу дизайнера VisualStudio (это известная проблема с Visual Studio (например, см. эту публикацию в StackOverflow для получения дополнительной информации), и, насколько мне известно, там нет изменений ожидается в ближайшем будущем

Итак, чтобы обойти это, я делаю BaseControl не абстрактным, а его реализацию методов IBaseControl виртуальными. Однако, поскольку эти методы не имеют смысла для a BaseControl (например, еще не все компоненты добавлены), я заставляю их бросать:

public class BaseControl : UserControl, IBaseControl
{
    /// 
    /// This IBaseControl method is not abstract because 
    /// that breaks the Designer
    /// 
    public virtual void LoadSettings()
    {
        throw new NotImplementedException("Implement in derived class.");
    }

    private void BaseControl_Load(object sender, EventArgs e)
    {
        // intention: derived methods automagically load their settings
        this.LoadSettings();
    }
}

В производном элементе управления у меня есть соответствующее переопределение:

public partial class DerivedControl : BaseControl
{
    public override void LoadSettings()
    {
        // load settings
    }
}

Несмотря на это, когда я пытаюсь открыть элемент управления в конструкторе, я получаю сообщение об ошибке, указывающее, что BaseControl.LoadSettings вызвало исключение.

Теперь помните, что LoadSettings вызывается в базовом классе, поэтому когда Конструктор загружает DerivedControl , он, в свою очередь, вызывает метод загрузки для [11100 211] BaseControl , который выдает.

Сталкивались ли вы с подобной проблемой? Как вы с этим справились? Если возможно, мне бы хотелось найти элегантное решение.

6
задан Community 23 May 2017 в 12:12
поделиться