【问题标题】:Why do base Windows Forms form class with generic types stop the designer loading?为什么具有泛型类型的基本 Windows 窗体窗体类会阻止设计器加载?
【发布时间】:2012-10-31 23:38:38
【问题描述】:

我正在尝试创建一个基本的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 { }

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

【问题讨论】:

  • 不是解释,但请注意,您可以(而且我确实)通过没有泛型基类,但通过拥有本身派生自泛型类的中间基类来解决此问题:@ 987654327@,FooBase : Base&lt;FooClass&gt;FooBase 的定义中除了它的基数之外,什么都没有。
  • @hvd 这是一种享受。我会接受它作为答案,但这是一个评论。
  • 我将其作为评论发布,因为它没有回答您提出的问题;我觉得你不应该接受。即使你问的问题对你来说可能不再重要:)
  • 背景资料(Visual Studio 杂志):Tap the Power of Inherited WinForms
  • 这个特殊问题可能在 Is visual inheritance supported by WinForms Designer in MVS 2008 for C++/CLI?answers 中有所涉及(在通用事物之间插入一个类和你的班级)。

标签: c# winforms inheritance


【解决方案1】:

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

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

a workaround 使用TypeDescriptionProviderAttribute,您可以在其中给设计者一个替换类,它应该实例化。

【讨论】:

  • 虽然你的回答解释了它为什么不起作用 - 我不明白你为什么不能实例化一个通用参数类,如果你有 Public Class GenericClass&lt;T&gt; { } 你实际上可以做 GenericClass&lt;T&gt; gc = new GenericClass&lt;T&gt;(); 所以为什么初始化组件不能处理这个吗?这是否取决于设计师不知道在实例化中使用什么类型?
  • T 必须被解析为一个具体的类,所以不,你不能这样做GenericClass&lt;T&gt; gc = new GenericClass&lt;T&gt;();
  • 对不起,让我重新措辞 GenericClass&lt;Foo&gt; gc = new GenericClass&lt;Foo&gt;(); 你可以为了争论这样做,因为我将 FooClass 作为类型传递给我认为它可能会放弃的基本形式在初始化组件期间。你有什么方法可以建议我如何让设计师加载按照我的思路做一些事情?
  • 查看我回答的解决方法文章中的示例 (pocketsilicon.com/…)。
  • 谢谢你 - 我明白为什么我现在不能这样做。然而,我确实使用评论来解决我的问题,但你回答了我的问题,为什么。
猜你喜欢
  • 2010-09-05
  • 1970-01-01
  • 2023-03-12
  • 2018-09-20
  • 2014-11-14
  • 2011-12-07
  • 2020-08-26
  • 2010-10-22
  • 2013-05-27
相关资源
最近更新 更多