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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top