2008-10-30 11 views
14

Ich möchte in der Lage sein, einen Wert dynamisch zu generieren, wo der Typ nur zur Laufzeit bekannt ist. Etwas wie folgt aus:Casting in VB.NET

myvalue = CType(value, "String, Integer or Boolean") 

Der String, der den Typ Wert enthält, wird als Argument übergeben und ist auch aus einer Datenbank ausgelesen, und der Wert wird als String in der Datenbank gespeichert.

Ist das möglich?

Antwort

7

Sicher, aber myvalue muss als Typ Object definiert werden, und das wollen Sie nicht unbedingt. Vielleicht ist dies ein Fall, der von Generika besser bedient wird.

Was bestimmt, welcher Typ verwendet wird?

+0

nur eine Zeichenfolge, die den Typ "String", "Integer", "Boolean" – Youssef

+0

Dann was legt die Zeichenfolge fest? –

+0

Die Zeichenfolge wird als Argument übergeben – Youssef

4

Nun, wie bestimmen Sie, welcher Typ erforderlich ist? Wie Joel sagte, ist dies wahrscheinlich ein Fall für Generika. Die Sache ist: Da Sie den Typ zum Zeitpunkt der Kompilierung nicht kennen, können Sie den Wert, der zurückgegeben wird, sowieso nicht behandeln, so dass Casting hier nicht wirklich sinnvoll ist.

2

Vielleicht anstatt dynamisch etwas zu werfen (was nicht zu funktionieren scheint), könnte man stattdessen reflection verwenden. Es ist einfach genug, bestimmte Methoden oder Eigenschaften aufzurufen und aufzurufen.

Es ist nicht schön, aber Sie könnten etwas davon in einer Zeile statt so viele tun.

5

Dies ist der kürzeste Weg, es zu tun. Ich habe es mit mehreren Typen getestet.

Sub DoCast(ByVal something As Object) 

    Dim newSomething = Convert.ChangeType(something, something.GetType()) 

End Sub 
9
Dim bMyValue As Boolean 
Dim iMyValue As Integer 
Dim sMyValue As String 
Dim t As Type = myValue.GetType 


Select Case t.Name 
    Case "String" 
     sMyValue = ctype(myValue, string) 
    Case "Boolean" 
     bMyValue = ctype(myValue, boolean) 
    Case "Integer" 
     iMyValue = ctype(myValue, Integer) 
End Select 

Es ist ein bisschen hacky aber es funktioniert.