[英]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.