Domanda
Vorrei essere in grado di trasmettere dinamicamente un valore in cui il tipo è noto solo in fase di esecuzione. Qualcosa del genere:
myvalue = CType(value, "String, Integer or Boolean")
La stringa che contiene il valore del tipo viene passata come argomento e viene anche letta da un database e il valore viene archiviato come stringa nel database.
È possibile?
Soluzione
Certo, ma myvalue
dovrà essere definito come di tipo Object
, e non lo si desidera necessariamente. Forse questo è un caso meglio servito dai generici.
Cosa determina quale tipo verrà utilizzato?
Altri suggerimenti
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
È un po 'confuso ma funziona.
Questo è il modo più breve per farlo. L'ho provato con più tipi.
Sub DoCast(ByVal something As Object)
Dim newSomething = Convert.ChangeType(something, something.GetType())
End Sub
Bene, come si determina quale tipo è richiesto? Come ha detto Joel, questo è probabilmente un caso per i generici. Il fatto è: poiché non conosci il tipo al momento della compilazione, non puoi comunque trattare il valore restituito, quindi il casting non ha molto senso qui.
Forse invece di lanciare dinamicamente qualcosa (che non sembra funzionare) potresti invece usare la riflessione. È abbastanza facile ottenere e invocare metodi o proprietà specifici.
Dim t As Type = testObject.GetType()
Dim prop As PropertyInfo = t.GetProperty("propertyName")
Dim gmi As MethodInfo = prop.GetGetMethod()
gmi.Invoke(testObject, Nothing)
Non è carino ma potresti farlo in una riga anziché in tante.