为什么使用泛型类型的基础Windows窗体类停止设计器加载?

时间:2012-11-12 14:32:54

标签: c# winforms inheritance

我正在尝试使用基本Windows Forms形式来保存常用功能和控件 - 但也保留对需要其方法类型的类的引用。每个表单都代表不同的类型,所以我认为我可以按照以下方式做一些事情:

public partial class Base<T> : Form where T : BaseClass
{
    private GenericHandler handler = new GenericHandler();
}

public class BaseClass { }

public class GenericHandler
{
    public void DoSomethingWithInstance<T>(T instance) where T : BaseClass
    {

    }
}

我的设计师类声明也反映了我的表单。现在,当我执行代表类型Foo的第二个表单时,我无法访问设计器,因为我收到此错误:

  

无法为此文件显示设计器,因为没有   可以设计其中的类。设计师视察了   文件中的以下类:Foo ---基类   无法加载'WindowsFormsApplication1.Base'。确保   已引用程序集并且已构建所有项目。

     

FooClass ---基类'WindowsFormsApplication1.BaseClass'   无法设计。

public partial class Foo : Base<FooClass>
{
    public Foo()
    {
        InitializeComponent();
    }
}

public class FooClass : BaseClass { }

为什么会发生这种情况/我做错了什么或有其他方法可以做到这一点?

1 个答案:

答案 0 :(得分:15)

当在设计器中加载Windows窗体或用户UserControl时,设计人员基本上是创建基类的实例(自定义窗体或控件直接派生自的类)然后通过反射手动/显式执行InitializeComponents()方法,以构建控件的预期设计。

在您的情况下,它无法创建基类的实例,因为它具有通用参数。如果表单或控件的基类是抽象的或没有默认构造函数,则会发生同样的情况。在这些情况下,设计人员也无法创建基类的实例。

使用a workaroundTypeDescriptionProviderAttribute,您可以为设计人员提供一个替代类,而不是它应该实例化。