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
5 Réponses :
faire retval = ctype (mystring, t) ou retval = ctype (myint, t) p>
avec une méthode générique, 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) p> 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. P> P> t code> sera exactement un type à chaque fois. Disons que vous avez le code appelant exemple (d'entier) code>. Maintenant, dans votre esprit, remplacez t code> avec entier code>. La méthode résultante contiendra ces lignes (entre autres).
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)
retVal = (T) "Hello World!"
Cela ne fonctionne pas, car CTYPE (votreGenericVariable, t) ne fonctionnera pas.
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
Un peu de surkill, n'est-ce pas?
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