为什么带有generics类型的基础Windows窗体表格类会停止设计器加载?

我试图有一个基本的Windows窗体表单,其中包含常见的function和控件 – 但也包含对一个类的引用,该类需要一个类型的方法。 每个表单都代表不同的类型,所以我认为我可以按照以下方式做一些事情:

public partial class Base : Form where T : BaseClass { private GenericHandler handler = new GenericHandler(); } public class BaseClass { } public class GenericHandler { public void DoSomethingWithInstance(T instance) where T : BaseClass { } } 

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

无法为此文件显示设计器,因为其中的任何类都无法设计。 设计者检查了文件中的以下类:Foo —无法加载基类“WindowsFormsApplication1.Base”。 确保已引用程序集并且已构建所有项目。

FooClass —无法设计基类’WindowsFormsApplication1.BaseClass’。

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

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

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

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

使用TypeDescriptionProviderAttribute有一个解决方法 ,您可以为设计器提供一个替代类,它应该实例化。