Объявление объекта условного типа с помощью System.Type - PullRequest
2 голосов
/ 07 июня 2010

Я пытаюсь запустить конкретную форму в зависимости от выбранного узла дерева в событии двойного клика. Код, который мне нужно использовать для запуска формы, немного громоздкий, потому что я должен убедиться, что форма не удалена и форма еще не открыта, прежде чем запускать новый экземпляр. Я хотел бы, чтобы вся эта проверка происходила в одном месте в конце функции, что означает, что я должен быть в состоянии передать правильный тип формы в код в конце. Я пытаюсь сделать это с System.Type, но, похоже, это не работает. Может кто-нибудь указать мне правильное направление, пожалуйста?

    With TreeView.SelectedNode
        Dim formType As Type
        Select Case .Text
            Case "Email to VPs"
                formType = EmailForm.GetType()
            Case "Revise Replacers"
                formType = DedicatedReplacerForm.GetType()
            Case "Start Email"
                formType = EmailForm.GetType()
        End Select
        Dim form As formType
         Dim form As formType
        Try
            form = CType(.Tag, formType)
            If Not form.IsDisposed Then
                form.Activate()
                Exit Sub
            End If
        Catch ex As NullReferenceException
            'This will error out the first time it is run as the form has not yet 
            ' been defined.
        End Try
        form = New formType
        form.MdiParent = Me
        .Tag = form
        CType(TreeView.SelectedNode.Tag, Form).Show()
    End With

1 Ответ

1 голос
/ 07 июня 2010

Вы не можете new a Type. Тип - это информация типа времени выполнения, new должен знать тип во время компиляции.

Используйте либо отражение (активатор), либо дженерики.

Извините, я не знаю VB, я не могу привести пример кода на VB.

c # пример:

T CreateForm<T>() where T : Form, new()
{
  return new T();
}

или

Form CreateForm(Type t)
{
  return (Form)Activator.CreateInstance(t);
}
...