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