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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何修复错误'设计者必须创建类型的实例“”但不能因为它标记为抽象“相关的知识,希望对你有一定的参考价值。

我总是得到错误设计者必须创建一个类型为“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());
        }
    }
答案

设计者在设计师中展示抽象控件没有任何问题。问题是当您的控件具有抽象基类时。

假设你有一个抽象的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();
        }
    }
}

以上是关于如何修复错误'设计者必须创建类型的实例“”但不能因为它标记为抽象“的主要内容,如果未能解决你的问题,请参考以下文章

如何修复'“frontend models model”必须在Yii2高级模板中有一个主键'错误

运行所选代码生成器时出错:'对象引用未设置为对象的实例。'错误?

如何修复“TypeError:添加的图层必须是类图层的实例。”在 Python 中

如何修复React-Native中的“路由组件'Principal'必须是React组件”错误

如何修复Firebird错误数据库已经使用引擎实例打开,与当前'不兼容

设计者必须创建一个...不能的实例,因为该类型被声明为抽象