Visual Studio 2019 / 通用表格 + 继承问题
Visual Studio 2019 / Generic Forms + Inheritance Issues
在我们的项目中,我们的表单具有以下 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 + 东西)
因此,这在运行时也按预期正常工作。但是,在应用程序的第一个 Debug-运行 之后,VisualStudio 以某种方式卡在了子窗体 EntityPage<T>
上。设计者现在无法加载这些表单,看起来是两条错误消息之一:
1.)
GenericArguments[0], 'Project.DBConnection.PurchaseOrder', on
Project.Client.Forms.EntityPage'1[T]' violates the constraint of type
parameter 'T'.
2.)
The designer could not be shown for this file because none of the
classes within it can be designed. The designer inspected the
following classes in the file: PurchaseOrderPage --- The base class
'Project.Client.Forms.EntityPage`1' could not be loaded. Ensure the
assembly has been referenced and that all projects have been built.
现在,唯一有帮助的是:清理、构建、关闭所有窗体、重新启动 VS、清理、构建 - 然后再次运行,直到再次调试应用程序。
知道那个特定代码有什么样的“Hick-Up”VS 吗?
特别是有关 EntityPage
无法加载的错误很奇怪 - 因为该文件一直在设计器中工作。
唯一要提到的是 classes 实现 IDBEntityWithID
在不同的项目中,它被添加为依赖项。 (Project.DBConnection
命名空间)
这很烦人,因为 DesignTime 实际上是唯一的时间,这些通用表单很方便 - 因为 VS 知道
的类型
T entity (in `EntityPage<T>`)
实现形式中的代码归结为
entity.MethodOfPurchaseOrder();
而不是
((PurchaseOrder)entity).MethodOfPurchseOrder();
我现在发现了这个关于 .net 2.0 的 post 并且只是出于好奇对它进行了测试。我该怎么说,它有效:)
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 中查看“存根”- 但这是我们可以接受的。
在我们的项目中,我们的表单具有以下 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 + 东西)
因此,这在运行时也按预期正常工作。但是,在应用程序的第一个 Debug-运行 之后,VisualStudio 以某种方式卡在了子窗体 EntityPage<T>
上。设计者现在无法加载这些表单,看起来是两条错误消息之一:
1.)
GenericArguments[0], 'Project.DBConnection.PurchaseOrder', on Project.Client.Forms.EntityPage'1[T]' violates the constraint of type parameter 'T'.
2.)
The designer could not be shown for this file because none of the classes within it can be designed. The designer inspected the following classes in the file: PurchaseOrderPage --- The base class 'Project.Client.Forms.EntityPage`1' could not be loaded. Ensure the assembly has been referenced and that all projects have been built.
现在,唯一有帮助的是:清理、构建、关闭所有窗体、重新启动 VS、清理、构建 - 然后再次运行,直到再次调试应用程序。
知道那个特定代码有什么样的“Hick-Up”VS 吗?
特别是有关 EntityPage
无法加载的错误很奇怪 - 因为该文件一直在设计器中工作。
唯一要提到的是 classes 实现 IDBEntityWithID
在不同的项目中,它被添加为依赖项。 (Project.DBConnection
命名空间)
这很烦人,因为 DesignTime 实际上是唯一的时间,这些通用表单很方便 - 因为 VS 知道
的类型T entity (in `EntityPage<T>`)
实现形式中的代码归结为
entity.MethodOfPurchaseOrder();
而不是
((PurchaseOrder)entity).MethodOfPurchseOrder();
我现在发现了这个关于 .net 2.0 的 post 并且只是出于好奇对它进行了测试。我该怎么说,它有效:) 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 中查看“存根”- 但这是我们可以接受的。