Создайте форму с помощью конструктора класса метода C#

#c# #winforms #class #oop #methods

Вопрос:

У меня есть класс с методом NewForm ниже:

 class cFormInteraction
{
    public static void NewForm(Form fm)
    {
        if (fm is null)
        {
            fm = new Form();
            fm.Show();
        }
    }
}
 

В formMain , я хочу создать форму, которую я хочу, с таким кодом, как:

 public static FormWantToShow FW;  
private void button1_Click(object sender, EventArgs e)
    {
        cFormInteraction.NewForm(FW);
    }
 

Я хочу решить эту проблему:

 if (fm is null)
        {
            fm = new Form(); // -> How i make the program understand and new the form i transmisson in.
            fm.Show();
        }
 

Ответ №1:

Предполагая, что каждая форма, которую вы хотите показать, имеет конструктор без параметров, вы можете сделать это с помощью универсального метода с ref параметром.

Общий аспект позволяет NewForm методу знать, какой тип формы создавать, а ref параметр позволяет вызывающему коду сохранять ссылку на вновь созданную форму, которая будет сохранена в поле.

 static class FormInteraction
{
    public static void NewForm<T>(ref T fm)
        where T : Form, new()
    {
        if (fm is null)
        {
            fm = new T();
            fm.Show();
        }
    }
}
 

Затем в вызывающем коде:

 public static FormWantToShow form;  
private void button1_Click(object sender, EventArgs e)
{
    FormInteraction.NewForm(ref form);
}
 

(Я изменил имена, чтобы следовать обычным соглашениям об именах на C#.)

Ответ №2:

Мне кажется, что это немного запутывает null проверку NewForm метода.

Также кажется странным, что название этого метода-это NewForm когда он может на самом деле не создавать форму.

Также странно, что он также показывает форму, не имея этого в названии.

Тогда мне кажется, что код должен быть таким:

 static class FormInteraction
{
    public static T NewAndShowForm<T>()
        where T : Form, new()
    {
        var fm = new T();
        fm.Show();
        return fm;
    }
}
 

Тогда вы бы назвали это так:

 public static FormWantToShow form;
private void button1_Click(object sender, EventArgs e)
{
    if (form != null)
    {
        form = FormInteraction.NewAndShowForm<FormWantToShow>();
    }
}