Как передать форму в качестве параметра в метод?(С #) - PullRequest
4 голосов
/ 18 июля 2011

Я уверен, что я неправильно понял название (не стесняйтесь делать его правильно), но пример кода устранит путаницу.

У меня есть что-то вроде этого:

    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: Мой вопрос не в том, как запустить мою программу (это было бы слишком тривиально), а в том, как точно использовать третью общую функцию для отображения форм, передавая форму в качестве аргумента (как описано выше).

Ответы [ 2 ]

5 голосов
/ 18 июля 2011

Есть способ сделать это, но он усложняется, потому что похоже, что вы используете 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.1020 * Преимущество такого подхода вместо простого создания формы и ее передачи (например, ShowForms(new Form1(abc));) заключается в том, что форма будет создана только в том случае, если вам нужно что-то с ней сделать.

2 голосов
/ 18 июля 2011

Вы можете использовать дженерики и interface для этого без vs2010 и .net 2.0.

Интерфейс будет выглядеть примерно так:

public interface IAbcForm { public string Abc {get;set;} }

, потому что вам понадобится свойство илиметод установки для установки вашего параметра.

Метод 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; }
}

}

...