gpt4 book ai didi

c# - Visual Studio 2010 设计器抛出实现虚拟方法

转载 作者:太空狗 更新时间:2023-10-29 21:36:09 30 4
gpt4 key购买 nike

我想要一个抽象的 UserControlBaseControl,它实现了一个接口(interface) IBaseControl。但是,将类设置为抽象中断 VisualStudio 设计器(这是 Visual Studio 的一个已知问题(例如,请参阅 this StackOverflow posting 了解更多信息),据我所知,有 no change expected in the near future

因此,为了解决这个问题,我使 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< 的加载方法,抛出。

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

最佳答案

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

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

因为只有基类被实例化,基类不能是抽象的,它需要按原样是函数式的。如果你抛出异常,那么设计者就会看到它们。唯一可行的解​​决方案是:

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

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

关于c# - Visual Studio 2010 设计器抛出实现虚拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6298885/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com