11

我正在尝试拥有一个基本的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
    {

    }
}

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

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

FooClass --- 不能设计基类“WindowsFormsApplication1.BaseClass”。

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

public class FooClass : BaseClass { }

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

4

1 回答 1

16

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

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

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

于 2012-11-12T14:41:12.250 回答