繁体   English   中英

Visual Studio 2019 / 通用 Forms + Inheritance 问题

[英]Visual Studio 2019 / Generic Forms + Inheritance Issues

在我们的项目中,我们的 forms 具有以下 class 结构:

public partial class InterceptorForm : Form

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

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

public partial class PurchaseOrderPage : EntityPage<PurchaseOrder>

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

EntityPage<T>提供围绕实体的所有通用功能(CRUD + 东西)

因此,这在运行时也可以正常工作并按预期工作。 然而,在应用程序的第一次调试运行之后,VisualStudio 不知何故被子 forms EntityPage<T>卡住了。 设计人员现在无法加载这些 forms,并带有 - 看起来 - 两个错误消息之一:

1.)

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

2.)

无法为此文件显示设计器,因为无法设计其中的任何类。 设计人员检查了文件中的以下类: PurchaseOrderPage --- 无法加载基础 class 'Project.Client.Forms.EntityPage`1'。 确保已引用程序集并且已构建所有项目。

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

知道该特定代码有什么样的“打嗝”VS吗?

特别是关于EntityPage无法加载的错误很奇怪 - 因为该文件一直在 Designer 中工作。

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

这很烦人,因为 DesignTime 实际上是这些 Generic-Forms 派上用场的唯一时间 - 因为然后 VS 知道

T entity (in `EntityPage<T>`)

实现 forms 中的代码归结为

entity.MethodOfPurchaseOrder();

而不是

((PurchaseOrder)entity).MethodOfPurchseOrder();

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

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

在两者之间添加非通用 class 可解决问题:

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 中查看“存根”——但这是我们可以忍受的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM