C# 泛型表单在设计器中不起作用的具体实现

C# 泛型表单在设计器中不起作用的具体实现,c#,generics,visual-studio-2005,windows-forms-designer,C#,Generics,Visual Studio 2005,Windows Forms Designer,我有一个基类,定义如下(我也在使用DevExpress组件): public抽象部分类BaseFormClass:XtraForm其中R:DataRow { ... } 与我从其他地方读到的相反,我仍然能够设计这个类。我不必为此创建一个具体的类。但是,当我创建一个从它派生的具体类(如下所示)时,该类在设计器中不起作用 public partial class ConcreteFormClass : BaseFormClass<StronglyTypedRow> { ... }

我有一个基类,定义如下(我也在使用DevExpress组件):

public抽象部分类BaseFormClass:XtraForm其中R:DataRow
{
...
}
与我从其他地方读到的相反,我仍然能够设计这个类。我不必为此创建一个具体的类。但是,当我创建一个从它派生的具体类(如下所示)时,该类在设计器中不起作用

public partial class ConcreteFormClass : BaseFormClass<StronglyTypedRow>
{
  ...
}
公共部分类ConcreteFormClass:BaseFormClass
{
...
}
我得到这个信息:

无法显示设计器的详细信息 此文件不可用,因为没有任何类 可以在其中进行设计。这个 设计师检查了以下内容: 文件中的类: ConcreteFormClass——基础 班 “BaseFormClass” 无法加载。确保 程序集已被引用,并且 所有项目都已建成


以前有人见过这个吗?任何已知的解决方法?

抱歉,但这行不通(很遗憾——我过去也希望你能这样做。)问题是设计师的基本方法

public partial class ConcreteFormClass : BaseFormClass<StronglyTypedRow>
{
  ...
}
为了向你展示你的形体模型,它实际上并没有试图构建形体本身;如果它这样做了,您将遇到其他问题——如果您的表单没有无参数构造函数怎么办?相反,它实际上实例化了表单基类的一个实例。然后它将遍历您的
InitializeComponents()
方法,并将您在其中定义的所有控件“分层”到基本窗体上

所以很明显,这是行不通的。您可以设计
BaseFormClass
的实例,因为要设计它,它会创建一个具体的
XtraForm
实例。但是您不能设计
ConcreteFormClass
的实例,因为要这样做,它需要创建一个抽象的
BaseFormClass
实例


最简单的解决方法是将
BaseFormClass
变成非抽象的。(如果你想绝对确保没有人能创建一个,也许你可以将默认构造函数设为私有?我不确定设计者是否能处理,但我不明白为什么它不能)很糟糕,但生活就是这样。向微软投诉,也许它在Visual Studio 2012中会更好。

对不起,但这根本行不通(很遗憾,我过去也希望你能这么做。)问题是设计师的基本方法

public partial class ConcreteFormClass : BaseFormClass<StronglyTypedRow>
{
  ...
}
为了向你展示你的形体模型,它实际上并没有试图构建形体本身;如果它这样做了,您将遇到其他问题——如果您的表单没有无参数构造函数怎么办?相反,它实际上实例化了表单基类的一个实例。然后它将遍历您的
InitializeComponents()
方法,并将您在其中定义的所有控件“分层”到基本窗体上

所以很明显,这是行不通的。您可以设计
BaseFormClass
的实例,因为要设计它,它会创建一个具体的
XtraForm
实例。但是您不能设计
ConcreteFormClass
的实例,因为要这样做,它需要创建一个抽象的
BaseFormClass
实例


最简单的解决方法是将
BaseFormClass
变成非抽象的。(如果你想绝对确保没有人能创建一个,也许你可以将默认构造函数设为私有?我不确定设计者是否能处理,但我不明白为什么它不能)很糟糕,但生活就是这样。向Microsoft投诉,也许在Visual Studio 2012中会更好。

这听起来像是一个非常类似的问题,让设计师呈现具有抽象基类的表单。我还没有做过任何通用的多重继承,但你至少可以试试看它是否有效

编辑:是的,好的,刚刚试过,我的解决方案肯定有效。您只需修改中间类定义和表单定义(包装在
#if DEBUG
中)


如果你能试试,请告诉我

这听起来与让设计器呈现具有抽象基类的表单非常相似。我还没有做过任何通用的多重继承,但你至少可以试试看它是否有效

编辑:是的,好的,刚刚试过,我的解决方案肯定有效。您只需修改中间类定义和表单定义(包装在
#if DEBUG
中)


如果你能试试,请告诉我

谢谢,但现在我尝试使用条件编译,将类具体化,并将其抽象成员虚拟化。我仍然收到同样的信息。我将其抽象化的原因不是为了防止实例化,而是因为我有抽象成员,其实现依赖于具体类。不过,感谢您的快速响应。我决定不设计派生类。这是没有必要的,我不得不改变我的架构一点,但这不是一件完全坏的事情。感谢您帮助我避免浪费太多时间尝试不可能的事情。请查看我和smelch的解决方案,并在我的答案+1中链接以获得详细解释。很糟糕,但生活就是这样。向微软投诉,也许在VisualStudio2012中会更好。我会把这个发给任何有问题的人:)谢谢,但现在我尝试使用条件编译,将类具体化,并将其抽象成员虚拟化。我仍然收到同样的信息。我将其抽象化的原因不是为了防止实例化,而是因为我有抽象成员,其实现依赖于具体类。不过,感谢您的快速响应。我决定不设计派生类。这是没有必要的,我不得不改变我的架构一点,但这不是一件完全坏的事情。谢谢