【问题标题】:Visual Studio 2019 / Generic Forms + Inheritance IssuesVisual Studio 2019 / 通用表单 + 继承问题
【发布时间】:2022-01-23 00:01:31
【问题描述】:

在我们的项目中,我们的表单具有以下类结构:

public partial class InterceptorForm : Form

public partial class EntityPage<T> : InterceptorForm where T : IDBEntityWithId

应用程序中的每个表单现在要么直接继承自 InterceptorForm,要么是 EntityPage&lt;T&gt; 的扩展,例如:

public partial class PurchaseOrderPage : EntityPage<PurchaseOrder>

InterceptorForm 提供非常基本的东西,例如按钮点击日志、表单值等。

EntityPage&lt;T&gt; 提供围绕实体的所有通用功能(CRUD + 东西)

因此,这在运行时也可以正常工作并且符合预期。然而,在应用程序的第一次调试运行之后,VisualStudio 不知何故被子窗体EntityPage&lt;T&gt; 卡住了。设计器现在无法加载这些表单,并带有 - 看起来 - 两个错误消息之一:

1.)

GenericArguments[0],“Project.DBConnection.PurchaseOrder”,开启 Project.Client.Forms.EntityPage'1[T]' 违反了类型的约束 参数“T”。

2.)

无法显示此文件的设计器,因为没有 可以设计其中的类。设计师检查了 文件中的以下类: PurchaseOrderPage --- 基类 无法加载“Project.Client.Forms.EntityPage`1”。确保 程序集已被引用,并且所有项目都已构建。

现在,唯一有帮助的是:清理、构建、关闭所有表单、重新启动 VS、清理、构建 - 然后它再次工作,直到再次调试应用程序。

任何想法有什么样的“Hick-Up” VS 与那个特定的代码?

尤其是关于无法加载EntityPage 的错误很奇怪 - 因为该文件一直在设计器中工作。

唯一要提的是,实现IDBEntityWithID 的类位于不同的项目中,该项目作为依赖项添加。 (Project.DBConnection 命名空间)

这很烦人,因为实际上只有 DesignTime 是这些 Generic-Forms 派上用场的唯一时间 - 因为那时 VS 知道类型

T entity (in `EntityPage<T>`)

实现表单中的代码归结为

entity.MethodOfPurchaseOrder();

而不是

((PurchaseOrder)entity).MethodOfPurchseOrder();

【问题讨论】:

  • 设计师可能很挑剔。通常,它要求您找到解决方法并使用它。然而,约束违反错误听起来与设计器错误无关。
  • @Flydog57 该错误仅出现在设计器/设计视图中。找到了解决方法,请参阅下面的答案。
  • 视觉继承对于设计师来说仍然是个大问题。该代码完美运行,构建,运行没有任何问题。问题出在视觉工作室的设计师身上。我们不得不多次重启VS,因为设计者想不通了。当您在设计器中打开表单时,通常会出现很多错误,重新启动 VS 总是为我们修复它。我知道你的痛苦,对此没有好的解决方案,但我仍然不想放弃视觉继承

标签: c# winforms visual-studio-2019


【解决方案1】:

我现在发现了这篇关于 .net 2.0 的帖子,只是出于好奇对其进行了测试。我应该说什么,它有效:) http://madprops.org/blog/designing-generic-forms/

在这里留下问题,也许有更优雅的解决方案,或者有人面临同样的问题:

在两者之间添加一个非泛型类可以解决问题:

public partial class InterceptorForm : Form

public partial class EntityPage<T> : InterceptorForm where T : IDBEntityWithId

public partial class PurchaseOrderPageStub : EntityPage<PurchaseOrder>

public partial class PurchseOrderPage : PurchaseOrderPageStub

stub 只是传递构造函数:

public partial class PurchaseOrderPageStub : EntityPage<PurchaseOrder>
{
    public PurchaseOrderPageStub() : base() => InitializeComponent();

    public PurchaseOrderPageStub(PurchaseOrder purchaseOrder, PageModes pageMode) : base(purchaseOrder, pageMode) => InitializeComponent();

    public PurchaseOrderPageStub(long entityId, PageModes pageMode) : base(entityId, pageMode) => InitializeComponent();
}

现在调试项目一次后无法在 Designer 中查看“存根” - 但这是我们可以忍受的。

【讨论】:

    猜你喜欢
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多