如何将表单作为参数传递给方法?(c#)
本文关键字:方法 参数传递 表单 | 更新日期: 2023-09-27 18:02:26
我确定我把标题弄错了(请随意修改),但是示例代码将消除混乱。
我有这样的事情要做:
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..
}
谢谢。没有它我也能生活,但如果我能有一个,那就太有帮助了。
编辑:我稍微修改了我的例子,使我的要求更清楚,因为第一个答案并没有完全解决我的问题。道歉。有一种方法可以做到这一点,但它变得更加困难,因为它看起来像你在使用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));
)是,表单将只创建,如果你需要做些什么
您可以使用泛型和interface
来完成此任务,而无需vs2010和。net 2.0。
接口应该类似于
public interface IAbcForm { public string Abc {get;set;} }
,因为你需要一个属性或setter方法来设置你的参数。
ShowForm
方法如下:
private void ShowForm<T>(string parameter) where T:IAbcForm, new
{
if(parameter == "cat") return;
var form = new T();
form.Abc = parameter;
form.ShowDialog();
}
用法如下:
ShowForm<Form1>("abc");
ShowForm<Form2>("abc");
ShowForm<Form3>("abc");
你的表单必须实现接口:
public class Form1 : Form, IAbcForm
{
// use backing field when .net 2.0 does not support auto properties
public string Abc { get;set; }
public Form1() {}
// I think your current constructor looks something like this:
public Form1(string abc) { Abc = abc; }
}
}