如何在 C# 中扩展表单类? [复制]

Posted

技术标签:

【中文标题】如何在 C# 中扩展表单类? [复制]【英文标题】:How to Extend form class in C#? [duplicate] 【发布时间】:2015-01-30 11:20:35 【问题描述】:

我用 c# 设计了 ​​3 种不同的获胜形式。

public partial class SLOSPR : form

    public bool IsCallable;
    public void PopulateData();

public partial class SLOFIX : form

    public bool IsCallable;
    public void PopulateData();

public partial class SPDBID : form

    public bool IsCallable;
    public void PopulateData();

我在每个表单的类中声明了一个成员变量IsCallable,在每个表单的类中声明了一个成员函数PopulateData()。之所以如此,是因为,在代码段中,我想声明一个表单类型的变量,并希望分配上述 3 个类中的任何一个的对象,并使用该 IsCallable 变量并调用 填充数据()

像这样:

public form RetForm()

     form frm=new /* constructor of any 3 forms mentioned above*/
     //this function can return any of the three types which will be decided at run time.
     return frm;


form frm=RetForm();

这里我想使用 IsCallable 并调用 PopulateData()

像这样:

if(frm.Iscallable)
    frm.PopulateData();

这在语法上是不可能的,因为 Iscallable 和 PopulateData 不是表单类的成员

为了解决这个问题,我将表单类扩展为一个抽象类,并从扩展类中声明了这 3 个表单。

public abstract class EXTENDED_FORM : form

     public bool IsCallable;
     public abstract void PopulateData();

并像这样更改了这三种形式的定义。

public partial class SLOSPR : EXTENDED_FORM

    public override void PopulateData()
    
       /*body for SLOSPR */
    

public partial class SLOFIX : EXTENDED_FORM

   public override void PopulateData()
    
       /*body for SLOFIX */
    

public partial class SPDBID : EXTENDED_FORM

   public override void PopulateData()
    
       /*body for SPDBID*/
    

现在我这样做了:

public EXTENDED_FORM RetForm()

     EXTENDED_FORM frm=new /* constructor of any 3 forms mentioned above*/
     //this function can return any of the three types which will be decided at run time.
     return frm;


EXTENDED_FORM frm=RetForm();

现在我可以这样调用了:

if(frm.Iscallable)
    frm.PopulateData();

将调用自动覆盖的 PopulateData。

我终于确定了自己的目标。但随着我的改变

 public partial class SLOSPR : form       /*[Designer generated code]*/

 public partial class SLOSPR : EXTENDED_FORM

Visual Studio 中的 GUI 设计器搞砸了,显示以下页面。

如何摆脱这个,在不妨碍设计师的情况下实现我的目的???

【问题讨论】:

您需要找出它崩溃的原因。为此,请打开两个 Visual Studio 实例。将第一个实例的调试器附加到第二个实例(通过 Debug | Attach to process)。在第二种情况下,在设计器中打开表单,以便发生错误。现在第一个实例应该进入调试器,向您显示导致问题的代码。 如果您开始输入“设计者无法创建实例摘要”,请查看关于第一个 Google 结果的副本。如果抽象类不包含实现,您也可以只在表单上使用接口。 你也可以通过接口来实现...i.imgur.com/Ephj3H3.png 【参考方案1】:

不要将 EXTENDED_FORM 抽象化;从其声明中删除抽象并添加不带参数的受保护构造函数

【讨论】:

这很不幸;在我以前的公司(遗留代码)中,我们不得不处理抽象的基本形式。这些问题有点不确定,有时一个干净的解决方案,关闭 VS 并重建会解决这个问题,有时你需要做两次/三次。我不确定是否存在任何有效的解决方法 - 所以我会选择这个答案。

以上是关于如何在 C# 中扩展表单类? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中复制类对象 [重复]

C#如何从表单中的文本框中获取文本,从不同的类调用

C# - 字典 - 如何在字典中获取特定类值的最大值? [复制]

如何编写用户可扩展的代码? [复制]

下面的 JSON 如何转换为 C# 类? [复制]

如何使用 C# 扩展方法