VisualStudio 2010 Designer抛出已实现的虚拟方法
本文关键字:实现 虚拟 方法 2010 Designer VisualStudio | 更新日期: 2023-09-27 17:58:44
我想要一个实现接口IBaseControl
的抽象UserControl
,BaseControl
。然而,将类设置为abstract会破坏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
是在基类中调用的,所以当设计器加载DerivedControl
时,它反过来调用BaseControl
的加载方法,该方法抛出。
你遇到过类似的问题吗?你是怎么处理的?如果可能的话,我想要一个优雅的解决方案。
抛出异常的原因是,奇怪的是,设计器根本没有编译或实例化您正在设计的类!它只编译和实例化您正在设计的控件的基类。
当您意识到向元素添加新的子控件需要进一步重新编译时,为什么会出现这种情况就变得显而易见了。此外,您添加的每个事件处理程序都会修改类,并且需要重新编译。由于无论如何都不会在设计器中调用事件处理程序,所以这完全没有必要。您使用的类类似于您的类,但不是您的类;这是一项正在进行的工作。
由于只有基类被实例化,所以基类不能是抽象的,它需要是功能性的,就像一样。如果抛出异常,则设计器将看到它们。唯一实用的解决方案是:
- 不从基类抛出异常,或者
- 根据是否为设计时,有条件地不抛出异常
两者都会起作用;使用您喜欢的或最适合您设计的。这只是设计师的工作方式,正如你所提到的,它不太可能改变。