【发布时间】:2020-04-07 18:03:10
【问题描述】:
我想根据用户权限启用/禁用 Windows 窗体应用程序中的控件。
最初我想在每个表单类中编写一个方法来检查用户凭据,然后启用/禁用其控件。但后来我意识到我可以(也许)创建一个静态类方法,它将表单作为参数并完成这项工作。
所以我开始编写它,假设有时我只想启用一两个面板的控件,而不是整个表单。所以,我需要的参数是:
- 不同数量的面板和/或
- 一个表单类。
我在这项任务中遇到的困难是我在尝试使面板参数变化时遇到错误,而且我不知道如何设置可以采用任何表单类的参数。我所有的表单类显然都继承自 Form 泛型类,但我不知道如何应用它。
这是我得到的:
public static void Enable(TableLayoutPanel[] containers = null)
{
if (MyOF.isEnabled)
{
return;
}
else
{
try
{
foreach (TableLayoutPanel table in containers)
{
foreach (Control control in table.Controls)
{
control.Enabled = false;
}
}
}
catch (NullReferenceException)
{
}
}
}
【问题讨论】:
-
C# 中实际上有一个称为“泛型类型”的功能可以解决您的问题。从这个意义上说,您使用“通用”一词的方式是不正确的。
Form是所有表单的基类。您可以创建一个像public static void DoStuff<T>(T someForm) where T : Form { // implement here }这样的方法,它可以接受任何特定表单作为参数并访问特定于该表单类型的成员。 -
谢谢詹姆斯。我在之前的搜索中遇到了这个问题,但我错过了
where T : Form部分。我会试试的。 -
另外,如何使 TableLayoutPanel 参数的数量变化?当我尝试调用仅传递一个面板的方法时,出现错误“无法从 ...Panel 转换为 ...Panel[]”
-
查找
params关键字 -
@JamesFaix this -
public static void DoStuff<T>(T someForm) where T : Form我称之为异端。 :-) 完全滥用通用用途。这就足够了 -public static void DoStuff(Form someForm)如果将其限制为Form,使其通用的目的是什么?
标签: c# visual-studio methods overloading