Создать и показать WinForm

Я пытаюсь создавать и показывать формы в VS 2013 с помощью общего метода, это мой метод:

void showOrUpdateForm<T>(ref Form form) where T : Form 
{
    if (form == null)
    {
        form = Activator.CreateInstance(typeof(T)) as T;
        form.Show();
    }
    else
        form.WindowState = FormWindowState.Normal;

    form.Focus();
}

этот код я получил здесь. Поэтому, когда я пытаюсь вызвать этот метод, как они сказали так:

 myForm1 form;
 showOrUpdateForm<myForm1>(ref form);

Это дает мне ошибку:

Ошибка 1 Наилучшее совпадение перегруженного метода для 'GestionEAS.GestionEAS.showOrUpdateForm(ref System.Windows.Forms.Form)' имеет недопустимые аргументы

Ошибка 2 Аргумент 1: невозможно преобразовать 'ref package.Views.form' в 'ref System.Windows.Forms.Form'

Как я могу это исправить?

3 ответа

Решение

Кажется, вы хотите что-то подобное:

// I'd rather return potentially created form directly (not via "ref")
// do you need "this" in the method? That's why "static"
static T showOrUpdateForm<T>(T form = null)
  where T: Form, new() {

  if (null == form) 
    form = new T(); // <- no Activator since "new()" constraint is declared

  form.WindowState = FormWindowState.Normal;
  form.BringToFront(); // <- if the form is not a foreground one

  if (form.CanFocus) // <- better check than have an exception
    form.Focus();

  return form;
}
...
// more compact and readable
myForm1 form = showOrUpdateForm<myForm1>();

Вы не можете передать myForm1 как ref Form,
Вы должны изменить это на ref T, так что тип параметра соответствует переменной.

Кроме того, вы должны добавить , new() к вашим общим ограничениям и заменить Activator.CreateInstance(typeof(T)) as T с new T()

Как насчет этого, будет приятно обслуживать создание форм с различными параметрами

void showOrUpdateForm<T>(ref T form, Func<T> formCreator) where T : Form 
{
    if (form == null)
    {
        form = formCreator();
        form.Show();
    }
    else
        form.WindowState = FormWindowState.Normal;
    if(form.CanFocus)
        form.Focus();
}

используя это как.,,

MyForm myForm = null;
form1 = showOrUpdateForm(myForm, () => new MyForm());
Другие вопросы по тегам