函数来获取表单的实例

ral*_*lph 4 c# forms casting

我想构建一个构建一个函数,它确实返回一个已经存在的表单实例.

fx = getForm(Form1);
Run Code Online (Sandbox Code Playgroud)

在这里我得到错误'FensterTest.Form1'是'类型'但是像'变量'一样使用所以我需要一些投射,但我不知道我需要投射什么.

private Form getForm(Form f)
{
  foreach (Form a in Application.OpenForms)
  {
    if (a is f)
    {
      f fx = (f)a;
      return fx;
    }
  }
  return null;
}
Run Code Online (Sandbox Code Playgroud)

无论我在哪里使用"f",我都会得到"找不到类型或命名空间名称'f'"

"f fx =(f)a;" 以前是"Form1 fx =(Form1)a"; 并且工作得很好,但因为我也需要使用Form2 Form3,...

dri*_*iis 5

您可能希望FormOpenForms集合中找到指定类型的集合.所以你需要传入类型 - 你可以传入一个Type对象,或者你可以使方法通用,这样你就可以传入一个类型参数.在类型参数中发送的优点是您可以是类型安全的(返回您搜索的具体类型以备不时之需).这是一个通用的解决方案:

private TForm getForm<TForm>()
    where TForm : Form
{
    return (TForm)Application.OpenForms.OfType<TForm>().FirstOrDefault();
}
Run Code Online (Sandbox Code Playgroud)

注意,OfType并且FirstOrDefault是LINQ扩展方法,请确保导入System.Linq.像这样使用上面的方法:

Form f = getForm<Form1>();
Run Code Online (Sandbox Code Playgroud)

  • 你可以添加一个`where TForm:Form`. (2认同)
  • @ralph,`其中TForm:Form`是一个通用约束,它确保你只能传递派生自Form的类型.它将是一种增强的类型安全性,确保您无法在OpenForms集合中搜索不相关的类型(例如,传入`getForm <string>`,这没有意义).我更新了代码示例. (2认同)