提问者:小点点

Visual Studio 2019/通用表单继承问题


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

public partial class InterceptorForm : Form

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

应用程序中的每个窗体现在要么直接继承自InterceptorForm,要么是EntityPage的扩展

public partial class PurchaseOrderPage : EntityPage<PurchaseOrder>

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

EntityPage

因此,这在运行时也可以正常工作。然而,在应用程序的第一次调试运行之后,VisualStudio不知何故被子窗体EntityPage卡住了

1.)

“常规参数[0],”项目。数据库连接。项目中的“采购订单”。客户形式。EntityPage“1[T]”违反了类型参数“T”的约束。

2.)

无法为此文件显示设计器,因为无法设计其中的任何类。设计师检查了文件中的以下类:PurchaseOrderPage——基类的项目。客户形式。无法加载EntityPage“1”。确保部件已被引用,并且已生成所有项目。

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

你知道什么样的“Hick-Up”VS有那个特定的代码吗?

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

唯一需要提到的是,实现IDBEntityBackID的类位于不同的Project中,它作为依赖项添加。(项目。名称空间

这很烦人,因为设计时间实际上是唯一一个方便使用这些通用形式的时间,因为VS知道

T entity (in `EntityPage<T>`)

实现表单中的代码归结为

entity.MethodOfPurchaseOrder();

而不是

((PurchaseOrder)entity).MethodOfPurchseOrder();

共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

其中,存根仅传递给构造函数:

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();
}

现在,调试项目一次后,“存根”不能在设计器中查看——但这是我们可以忍受的。