Как передать форму в качестве параметра методу? (С#)
Я уверен, что получил название ужасно неправильно (не стесняйтесь сделать его правильным), но пример кода прояснит путаницу.
Мне нужно сделать вот что:
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()
}
Теперь, как я могу написать один метод, чтобы показать такие формы, передавая сам класс form. Или я порчу саму концепцию классов и объектов? Что-то вроде этого:
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..
}
Спасибо. Я могу прожить и без него, но мне бы очень помогло, если бы я мог один.
EDIT: я немного изменил свой пример, чтобы сделать мое требование более ясным, так как первый ответ не был точно адресован моей проблеме. Извинения.
EDIT2: мой вопрос не в том, как запустить мою программу (это было бы слишком тривиально), а как точно использовать третью общую функцию для отображения форм, передавая форму в качестве аргумента (как описано выше).
2 ответов:
Вы можете использовать generics и an
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; } }}
Есть способ сделать это, но он усложняется, потому что похоже, что вы используете 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));), состоит в том, что форма будет создана только в том случае, если вам нужно это сделать. что-то с ним.
Comments