如何将字符串转换为T的泛型?

时间:2019-05-06 19:37:11

标签: vb.net generic-programming

我如何称呼通用Of T子选择表单字符串?
如何更好地编写这样的代码?

Sub ShowAddfrm(Of T As {Form, New})()
     dim frm as new T 'New Form
     frm.Show()
End Sub
Private Sub btnAddProblemfrm_Click(sender As Object, e As EventArgs)
    Dim keys As String = CType(sender, Button).Name.Replace("btnAdd", "")

    If keys = "frmShowProblem" Then
        ShowAddfrm(Of frmShowProblem)()
    End If

    If keys = "frmUser" Then
        ShowAddfrm(Of frmUser)()
    End If
End Sub

1 个答案:

答案 0 :(得分:0)

尝试此重载方法,同时允许Form引用和字符串参数。
您可以传递表单的默认实例,直接将其命名:

ShowAddfrm(Form2)

或表单名称:

ShowAddfrm("Form2")

或在事件处理程序中使用控件的Tag属性(或任何其他源):

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    ShowAddfrm(DirectCast(sender, Control).Tag.ToString())
End Sub

有所不同:

  • 如果您使用传递表单实例,则只会创建该实例。这意味着,如果您使用按钮来显示表单,并且多次按下按钮,则不会创建新实例。如果关闭窗体,则将显示一个新实例。
  • 如果使用字符串版本,则每次调用此方法时,都会显示一个新的Form实例,因此您可以在屏幕上显示多个Form。

string 版本使用Activator.CreateInstance使用其名称来生成Form的新实例。

Sub ShowAddfrm(Of T As {Form, New})(ByVal form As T)
    form.Show()
End Sub
Sub ShowAddfrm(formName As String)
    Dim appNameSpace = Assembly.GetExecutingAssembly().GetName().Name
    Dim form = CType(Activator.CreateInstance(Type.GetType($"{appNameSpace}.{formName}")), Form)
    ShowAddfrm(form)
End Sub