如何修复“;由于其保护级别而不可访问”;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
?
或者这种做法是错误的?
在我看来,您不应该直接使用表单。如果我正确阅读了您的设置,您希望在完成某些工作时显示进度指示器。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
,对于任何属于引用类型的类型,您可能需要返回克隆或副本(以确保客户端无法更改它)。
包装或暴露所需的方法。但不知何故,我不喜欢这种方法,限制访问不是一个坏主意,但不应该是这种抽象的全部目的。尽量让访问更容易,而不是限制。
您可以将方法声明为内部,这将允许您从程序集中调用方法。