【发布时间】:2022-01-23 00:01:31
【问题描述】:
在我们的项目中,我们的表单具有以下类结构:
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 不知何故被子窗体EntityPage<T> 卡住了。设计器现在无法加载这些表单,并带有 - 看起来 - 两个错误消息之一:
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