我确信我的标题非常错误(随意使其正确),但示例代码可以清除混乱。
我有这样的事情要做:
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:我的问题不是如何让我的程序运行(这太简单了),而是如何通过将表单作为参数传递来精确地使用第三个常用函数来显示表单(如上所述)。
答案 0 :(得分:5)
有一种方法可以做到这一点,但它变得更难,因为看起来你正在使用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));
)的好处是,只有在您需要对其执行操作时才会创建表单。
答案 1 :(得分:2)
您可以使用泛型和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; }
}
}