如何将Form作为参数传递给方法?(C#)

naw*_*fal 4 c# winforms c#-2.0

我确信我的标题非常错误(随意使其正确),但示例代码将清除混乱.

我有这样的事情要做:

    private void a_Click(object sender, EventArgs e)
    {           
        if (abc = "cat")
            return;

        Form1 f = new Form1(abc);
        f.ShowDialog()
    }

    private void b_Click(object sender, EventArgs e)
    {
        if (abc = "cat")
            return;

        Form2 f = new Form2(abc);
        f.ShowDialog()
    }

    private void c_Click(object sender, EventArgs e)
    {
        if (abc = "cat")
            return;

        Form3 f = new Form3(abc);
        f.ShowDialog()
    }
Run Code Online (Sandbox Code Playgroud)

现在,我如何通过传递表单类本身来编写单个方法来显示这些表单.或者我是否破坏了类和对象的概念?像这样的东西:

   private void ShowForms(Form F)
   {
       if (abc = "cat")
           return;

       F f = new F(abc);
         f.Showdialog();
   }
Run Code Online (Sandbox Code Playgroud)

然后

    private void a_Click(object sender, EventArgs e)
    {
        ShowForms(Form1); // I cant pass string abc from here..
    }
Run Code Online (Sandbox Code Playgroud)

谢谢.我可以没有它,但如果我能拥有它,那将会有很大的帮助.

编辑:我稍微修改了我的例子,使我的要求更加清晰,因为第一个答案并没有完全解决我的问题.道歉.

编辑2:我的问题不是如何让我的程序运行(这将是太微不足道),而是如何通过传递形式作为参数(如上所述)精确地使用第三个常用函数来显示表单.

adr*_*nks 5

有一种方法可以做到这一点,但它变得更难,因为它看起来像你正在使用C#v2(来自问题上的标签).

更改您的ShowForms方法以接受Func可以Form使用提供的参数创建a实例的实例:

private void ShowForms(Func<string, Form> formCreator)
{
    if (abc == "cat")
    {
        return;
    }

    Form form = formCreator(abc);
    form.ShowDialog();
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以调用它来传递Func将用于创建每个单独的表单实例的实例:

private void a_Click(object sender, EventArgs e)
{
    ShowForms(p => new Form1(p));
}

private void b_Click(object sender, EventArgs e)
{
    ShowForms(p => new Form2(p));
}
Run Code Online (Sandbox Code Playgroud)

因为您使用的是C#v2,所以您还需要声明Func定义:

public delegate TResult Func<TParameter, TResult>(TParameter parameter);
Run Code Online (Sandbox Code Playgroud)

如果您可以使用更高版本的C#,则无需声明此最后一部分.但是,您需要使用更高版本的编译器来编译它(VS2010应该没问题) - 它正在利用编译器的更高版本理解lamda语法这一事实.

这样做的好处不仅仅是创建表单并将其传递给(例如ShowForms(new Form1(abc));),只有在需要对表单执行某些操作时才会创建表单.