如何解决错误'设计者必须创建一个类型为“”的实例,但不能创建,因为它标记为抽象“

时间:2019-04-27 12:55:21

标签: c# winforms inheritance user-controls windows-forms-designer

我总是会收到错误设计师必须创建一个类型为“ BaseFractal”的实例,但无法创建,因为它标记为“抽象”。没有解决方案 How can I get Visual Studio 2008 Windows Forms designer to render a Form that implements an abstract base class? 工作

此错误还有其他解决方案吗?

[System.ComponentModel.TypeDescriptionProvider 
(typeof(AbstractControlDescriptionProvider<BaseFractal, UserControl>))]
public abstract class BaseFractal : UserControl
{
    private Contour _Contour = new Contour() { color = Color.Black, weight = 1, indent = Indents.full };

    /// <summary>
    /// Sets or gets the contour fields
    /// </summary>
    /// <remarks>
    /// TODO
    /// </remarks>
    public Contour Contour
    {
        get { return _Contour; }
        set { _Contour = value; }
    }

    private int _Order = 0;

    /// <summary>
    /// Sets or gets the order of the fractal
    /// </summary>
    /// <remarks>
    /// TODO
    /// </remarks>
    public int Order
    {
        get { return _Order; }
        set { _Order = value; }
    }

    public BaseFractal()
    {
        InitializeComponent();
    }

    /// <summary>
    /// Create the path that needs to be drawn
    /// </summary>
    /// <remarks>
    /// TODO
    /// </remarks>
    protected abstract GraphicsPath CreatePath();

    /// <summary>
    /// Draw the fractals contour
    /// </summary>
    /// <remarks>
    /// TODO
    /// </remarks>
    protected void DrawFractal(PaintEventArgs e)
    {
        using (SolidBrush brush = new SolidBrush(Contour.color))
        {
            e.Graphics.FillPath(brush, CreatePath());
        }
    }

2 个答案:

答案 0 :(得分:1)

设计器在设计器中显示抽象控件没有任何问题。问题是您的控件具有抽象基类。

假设您有一个抽象BaseControl作为MyControl的基类。然后,当您尝试在设计器中查看BaseControl时,没有问题,但是设计器无法显示MyControl

问题是因为当您在设计视图中打开MyControl时,设计器尝试创建基类的实例以在设计器中显示该实例,但是由于该基类是抽象的,因此无法创建实例,并且无法加载。

作为解决此问题的一种选择,您可以创建一个非抽象基类,该基类派生自用于调试模式的基本控件。然后设计人员可以显示MyControl

注意:使用 #if DEBUG 只是为了为RELEASE进行构建时摆脱中间的非抽象基础。如果您不关心它,则不需要这些指令,只需创建中间非抽象库并使用它即可。

namespace SampleWinApp
{
#if DEBUG
    public partial class MyControl : NonAbstractBase
#else
    public partial class MyControl : BaseControl
#endif
    {
        public MyControl()
        {
            InitializeComponent();
        }
    }
#if DEBUG
    public class NonAbstractBase : BaseControl { }
#endif
}

这是我的摘要BaseControl

namespace SampleWinApp
{
    public abstract partial class BaseControl : UserControl
    {
        public BaseControl()
        {
            InitializeComponent();
        }
    }
}

答案 1 :(得分:0)

您可以使用抽象类上的属性来解决此问题,如下所示:

[TypeDescriptionProvider(typeof(AbstractControlDescriptionProvider<MyBaseFormEf, Form>))]