8
votes

Fonction générique vb.net

Ce que je veux faire est, sur la base du type de T font différentes opportunités. Ci-dessous est un exemple simple de mon problème.

Public Shared Function Example(Of T)() As T
    Dim retval As T
    If TypeOf retval Is String Then
        Dim myString As String = "Hello"
        retval = myString
    ElseIf TypeOf retval Is Integer Then
        Dim myInt As Integer = 101
        retval = myInt
    End If
    Return retval
End Function


0 commentaires

5 Réponses :


0
votes

faire retval = ctype (mystring, t) ou retval = ctype (myint, t)


0 commentaires

6
votes

avec une méthode générique, t sera exactement un type à chaque fois. Disons que vous avez le code appelant exemple (d'entier) . Maintenant, dans votre esprit, remplacez t avec entier . La méthode résultante contiendra ces lignes (entre autres). xxx

attribuer une chaîne à un entier comme celui qui ne fonctionnera jamais. Bien sûr, ce code n'exécutera jamais, car le bloc IF empêche cela, mais le code ne sera toujours pas compilé. (En tant que côté non, le code ci-dessus ne parviendra pas à compiler car le type de clé de typeof est limité à utiliser avec des types de référence, mais c'est une autre histoire)

typiquement lors de la création de méthodes génériques, vous voudrez faire le Même chose avec n'importe quelle entrée que vous obtenez, mais de manière sûre. Si vous souhaitez avoir un comportement différent pour différents types d'entrée, vous êtes généralement meilleur en surcharge des méthodes.


1 commentaires

Vrai, mais c'est toujours possible. Tout ce qui est nécessaire est que la fonction «casting» renvoie un type générique. Le secret le jette d'abord pour s'opposer, puis renvoyé. Voir ma réponse ci-dessous. Fondamentalement, t retval = ctype (CTYPE (votre GenericVariable, objet), t)



1
votes
retVal = (T) "Hello World!"

1 commentaires

Cela ne fonctionne pas, car CTYPE (votreGenericVariable, t) ne fonctionnera pas.



0
votes

Une solution alternative est d'encapsuler ce type de logique dans une classe et utilisez VB CallbyName Fonction:

    Class Aux(Of T)
        Public Value As T

        Private dicc As Dictionary(Of String, Object)

        Sub New()
            dicc = New Dictionary(Of String, Object)
            dicc.Add("system.string", "hola")
            dicc.Add("system.int32", 15)
            dicc.Add("system.double", 15.0)
        End Sub

        Public Function Test() As T
            Dim typeName As String = GetType(T).ToString.ToLower

            If dicc.ContainsKey(typeName) Then
                CallByName(Me, "Value", CallType.Set, dicc(typeName))
            End If

            Return Value
        End Function

        Protected Overrides Sub Finalize()
            MyBase.Finalize()

            If Not (dicc Is Nothing) Then dicc.Clear()
            dicc = Nothing
        End Sub
    End Class


1 commentaires

Un peu de surkill, n'est-ce pas?



10
votes

C'est probablement un peu en retard, mais essayez ceci:

    Public Shared Function CAnyType(Of T)(ByRef UTO As Object) As T
        Return CType(UTO, T)
    End Function


    Public Shared Function ExecuteSQLstmtScalar(Of T)(ByVal strSQL As String) As T
        Dim T_ReturnValue As T

        ' Here we have the result of a DB query ' 
        Dim obj As Object = "Value from DB query cmd.ExecuteScalar"
        Dim strReturnValue As Object = obj.ToString();



        Try
            Dim tReturnType As Type = GetType(T)

            If tReturnType Is GetType(String) Then
                Return CAnyType(Of T)(strReturnValue)
            ElseIf tReturnType Is GetType(Boolean) Then
                Dim bReturnValue As Boolean = Boolean.Parse(strReturnValue)
                Return CAnyType(Of T)(bReturnValue)
            ElseIf tReturnType Is GetType(Integer) Then
                Dim iReturnValue As Integer = Integer.Parse(strReturnValue)
                Return CAnyType(Of T)(iReturnValue)
            ElseIf tReturnType Is GetType(Long) Then
                Dim lngReturnValue As Long = Long.Parse(strReturnValue)
                Return CAnyType(Of T)(lngReturnValue)
            Else
                MsgBox("ExecuteSQLstmtScalar(Of T): This type is not yet defined.")
            End If

        Catch ex As Exception

        End Try

        Return Nothing
    End Function


0 commentaires