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

2024-02-17

我正在努力拥有一个基地Windows 窗体 http://en.wikipedia.org/wiki/Windows_Formsform 包含通用功能和控件 - 但也包含对其方法需要类型的类的引用。每种形式都代表不同的类型,所以我认为我可以按照以下方式做一些事情:

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 { }

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


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

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

解决方法 http://www.pocketsilicon.com/post/Using-Visual-Studio-Whidbey-to-Design-Abstract-Forms为此,使用类型描述提供者属性 http://msdn.microsoft.com/en-us/library/system.componentmodel.typedescriptionproviderattribute.aspx您可以在其中为设计器提供一个应该实例化的替换类。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么具有泛型类型的基本 Windows 窗体表单类会停止设计器加载? 的相关文章

随机推荐