首页 > 解决方案 > 在不知道泛型类型的情况下转换为泛型类型

问题描述

我有一个ValueControl使用泛型类型的接口 () 和另一个ValueControlHandler使用该接口实例的类 ()。现在,当我创建时ValueControlHandlerCreateHandler我需要传递泛型类型。现在TCtrl很“容易”(我只是使用ValueControl但我不知道如何设置TVal.

Public Interface ValueControl(Of T)
    ReadOnly Property Value As T
End Interface

Public Interface CtrlChanges
    Function HasChanges() As Boolean
End Interface

Friend Class ValueControlHandler(Of TCtrl As ValueControl(Of TVal), TVal)
    Implements CtrlChanges
    ....
End Class

Private Function DummyCreateHandler(Of TVal)(ByVal ctrl as ValueControl(Of TVal)) As CtrlChanges
    Return New ValueControlHandler(Of ValueControl(Of TVal), TVal)(ctrl)
End Function

Private Function CreateHandler(ByVal ctrl As Object) As CtrlChanges
    If TypeOf ctrl Is ValueControl(Of ValueControl(Of ???), ???) Then  ' <!--- Problem here
        Return New ValueControlHandler(Of ValueControl(Of ???), ???)(ctrl)  ' <!--- Problem here
    ElseIf Typeof ctrl Is AnotherType Then
        Return New AnotherCtrlChanges(....)
    Else
        Return Nothing
    End If
End Function

棘手的部分是,我什至不需要知道类型,因为我对此CtrlChanges部分感兴趣。是删除泛型并默认为的唯一解决方案Object吗?我也试过了,DummyCreateHandler但我仍然不知道如何检查类型,而且它对第二次通话并没有太大帮助。

ValueControlHandler如果这有帮助,这是完整的课程:

Friend Class ValueControlHandler(Of TCtrl As ValueControl(Of TVal), TVal)
    Implements CtrlChanges

    Protected ReadOnly Ctrl As TCtrl

    Protected ReadOnly Val As TVal

    Public Sub New(ByVal Ctrl As TCtrl)
        Me.Ctrl = Ctrl
        Me.Val = CurrentValue
    End Sub

    Public ReadOnly Property CurrentValue As TVal
        Get
            Return Ctrl.Value
        End Get
    End Property

    Public Overridable Function HasChanges() As Boolean Implements CtrlChanges.HasChanges
        Return CType(CurrentValue, Object) <> Val
    End Function
End Class

标签: vb.netgenerics

解决方案


您是否考虑过将工厂方法作为其中的一部分ValueControl?(旁注,接口上的“I”前缀是标准约定)

(请注意,我的 VB.NET 有点生疏,尽管我的拼写错误,但希望您能理解这种方法的意图):

Public Interface IValueControl(Of T)
   ReadOnly Property Value As T
   ValueControlHandler(Of T) CreateValueControlHandler(ctrl As IValueControl(Of T))
End Interface

然后每个控件都可以生成它自己的ValueControlHandler

Public Class MyControl Inherits Textbox Implements IValueControl(Of String)

   Public Function ValueControlHandler(Of T) CreateValueControlHandler()

      Return New ValueControlHandler(Of MyControl, String)(Me)

   End Fucntion

End Class

推荐阅读