如何修复“;由于其保护级别而不可访问”;winform中出现错误

本文关键字:访问 winform 错误 何修复 于其 保护 | 更新日期: 2023-09-27 18:28:50

我有一个Form类

    partial class ProgressMainForm : Form
    {
      public ProgressMainForm()
      {
        InitializeComponent();
      }
    }

然后是一个使用该类并包含用户的所有功能的类

    public class ProgressForm
    {
        public ProgressMainForm myProgressForm;
        public ProgressForm(string title)
        {
            myProgressForm = new ProgressMainForm();
            myProgressForm.Text = title;
        }
        public void SetProgressBar(int min, int max)
        {
        ....
    }

然后我在我的项目中使用这个ProgressForm类,就像这个

            progresswindow = new ProgressForm("Replacing All Strings");

这样一来,progresswindow只包含与ProgressForm功能相关的成员,并且所有这些Form成员都对用户隐藏。

但有时我需要访问这些Form成员,例如当我需要Invoke方法时。

有没有一种方法可以在不公开ProgressMainForm的情况下让用户访问ProgressForm中的myProgressForm

或者这种做法是错误的?

如何修复“;由于其保护级别而不可访问”;winform中出现错误

在我看来,您不应该直接使用表单。如果我正确阅读了您的设置,您希望在完成某些工作时显示进度指示器。ProgressForm应该公开用于设置计数器并递增计数器的方法;当您在另一个线程上运行它时,表单操作应该在ProgressForm的方法内部完成。您的Invoke属于那里,并封装在合适的方法中。如果您想更改ProgressMainForm的一些可视化属性,请将这些属性中继到ProgressForm。

要继续,调用代码除了设置进度边界、启动、设置当前百分比和停止之外,应该不知道ProgressForm做了什么。这样,如果您被要求将应用程序移植到另一个UI系统,则需要更改的代码量将大大减少。

有没有一种方法可以让用户在不公开ProgressMainForm的情况下访问ProgressForm中的myProgressForm?

是的,您可以在ProgressForm上创建一些公开ProgressMainForm特定属性的公共属性。

private ProgressMainForm myProgressForm;
public int SomeProperty
{
  get { return myProgressForm.IntProp; }
  set { myProgressForm.IntProp = value; }
}

对于只读属性,请省略set,对于任何属于引用类型的类型,您可能需要返回克隆或副本(以确保客户端无法更改它)。

包装或暴露所需的方法。但不知何故,我不喜欢这种方法,限制访问不是一个坏主意,但不应该是这种抽象的全部目的。尽量让访问更容易,而不是限制。

您可以将方法声明为内部,这将允许您从程序集中调用方法。