提问者:小点点

为什么具有泛型类型的基本Windows窗体类会停止设计器加载?


我正在尝试创建一个基本的Windows窗体,它包含公共功能和控件,但也包含对类的引用,该类的方法需要类型。每个表单都代表不同的类型,因此我认为我可以按照以下思路做一些事情:

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”。确保部件已被引用,并且已生成所有项目。

基类WindowsFormsApplication.不能设计BaseClass。

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

public class FooClass : BaseClass { }

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


共1个答案

匿名用户

当在设计器中加载Windows Form或用户UserControl时,基本上设计器正在创建基类的实例(您的自定义窗体或控件直接从该类派生),然后通过反射手动/显式地执行初始化组件()方法建立控件的预期设计。

但是,在您的情况下,它不能创建基类的实例,因为它有一个泛型参数。如果窗体或控件的基类是抽象的或没有默认构造函数,也会发生同样的情况。在这些情况下,设计器也将无法创建基类的实例。

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