c# - 如何将表单作为参数传递给方法? (C#)

标签 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()
    }

现在我如何编写一个方法来通过传递表单类本身来显示这样的表单。还是我破坏了类和对象的概念?像这样:

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

       F f = new F(abc);
         f.Showdialog();
   }

然后

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

谢谢。没有它我也能活下去,但如果我能拥有它会很有帮助。

编辑:我稍微修改了我的示例以使我的要求更清楚,因为第一个答案并没有完全解决我的问题。抱歉。

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

最佳答案

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

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

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

    Form form = formCreator(abc);
    form.ShowDialog();
}

然后您可以调用它传递一个 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));
}

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

public delegate TResult Func<TParameter, TResult>(TParameter parameter);

如果您可以使用更高版本的 C#,则不需要声明这最后一部分。 然而,您将需要使用更高版本的编译器来编译它(VS2010 应该没问题)——它利用了更高版本的编译器理解 lamda 语法这一事实。

这样做的好处不是仅仅创建表单并将其传入(例如 ShowForms(new Form1(abc));)是表单只会在您需要时创建用它做点什么。

关于c# - 如何将表单作为参数传递给方法? (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6727232/

相关文章:

c# - 为什么 List<T> 的 Enumerator 是公开的?

c# - 清除 WPF 中的组合框

c# - 转换类型

c# - 使用委托(delegate)类型与方法

反射(reflection):检索属性值的不同方式

c# - 将类库从 asp.net 3.5 转换为 4

c# - 如何在运行时克隆 Control 事件处理程序?

c# - 澄清使用匿名方法从单独的线程更新 GUI

c# - 在 Windows 窗体中调整窗口/控件比例

.net - 此异常消息 : Not enough quota is available to process this command 中引用的是什么 'quota'