繁体   English   中英

VisualStudio 2010 Designer 抛出已实现的虚拟方法

[英]VisualStudio 2010 Designer throws on implemented virtual method

我想要一个抽象的UserControlBaseControl ,它实现了一个接口IBaseControl 但是,将 class 设置为抽象会破坏 VisualStudio 设计器(这是 Visual Studio 的一个已知问题(例如,有关更多信息,请参阅此 StackOverflow 帖子),据我所知, 预计在不久的将来不会有任何变化

因此,为了解决这个问题,我使BaseControl不是抽象的,并且它对IBaseControl方法的实现是虚拟的。 但是,由于这些方法对BaseControl没有意义(例如,尚未添加所有组件),我让它们抛出:

public class BaseControl : UserControl, IBaseControl
{
    /// <summary>
    /// This IBaseControl method is not abstract because 
    /// that breaks the Designer
    /// </summary>
    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是在基础 class 中调用的,因此当设计器加载DerivedControl时,它会依次调用BaseControl的加载方法,这会抛出。

你遇到过类似的问题吗? 你是怎么处理的? 如果可能的话,我想要一个优雅的解决方案。

抛出异常的原因是,奇怪的是,设计者根本没有编译或实例化您正在设计的 class 它只编译和实例化您正在设计的控件的基础 class。

当您意识到向元素添加新的子控件需要进一步重新编译时,为什么会出现这种情况变得显而易见。 此外,您添加的每个事件处理程序都会修改 class 并且再次需要重新编译。 由于无论如何都不会在设计器中调用事件处理程序,因此这完全没有必要。 您使用类似于您的 class 但不是您的 class 的 class 进行设计; 这是一项正在进行的工作。

由于仅实例化了基础 class,因此基础 class 不能是抽象的,它需要按原样运行。 如果你抛出异常,那么设计者会看到它们。 唯一实用的解决方案是:

  • 不从基础 class 抛出异常,或
  • 根据是否是设计时有条件地不抛出异常。

两者都行; 使用您喜欢的或最适合您的设计的。 这正是设计师的工作方式,正如您所提到的,它不太可能改变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM