2013-03-06 17 views
9

In VB.NET CType può essere utilizzato per convertire un tipo in un altro.CType in VB.NET con secondo parametro dinamico (tipo)

CType(expression,type) 

Ho la "espressione" memorizzata in una classe di oggetti esempio, dire "objExp". Ho il "tipo" memorizzato in un'istanza di classe Type, ad esempio "objType".

Sto provando CType(objExp, objType) Mi sto ottenendo errore di compilazione, come dovrei farlo? "objType" viene recuperato e assegnato in fase di esecuzione.

+0

'CType' viene utilizzato per indicare al compilatore quale tipo è un oggetto, così' 'expression' e type' deve essere noto al momento della compilazione ** **. Tuttavia, quale errore ottieni? –

+0

E DOVE memorizzerai il risultato se è sconosciuto fino al momento dell'esecuzione? Per questo tipo di conversione puoi semplicemente affidarti a ** System.Convert.ChangeType **. Questo è un altro problema XY? –

+0

@TimSchmelter, l'errore è "Tipo 'objType' non è definito" – Brij

risposta

1

Questo semplicemente non è possibile. Il CType espressione deve essere passato un'istanza Type che è noto al momento della compilazione come Integer, String, ecc ... non accetta i valori che sono di tipo Type

0

Se non ha senso di lanciare un oggetto a un tipo variabile (un tipo sconosciuto al momento della compilazione). L'intero punto di lancio è specificare il tipo esatto. Sospetto, tuttavia, che piuttosto che utilizzare un oggetto Type, ciò di cui hai veramente bisogno è un metodo generico o una classe generica. Per esempio:

Public Function DoSomethingGenerically(Of T)(MyParameter As MyType) As T 
    Return CType(MyParameter.MyProperty, T) 
End Function 

Questo è un metodo davvero inutile, dal momento che tutto ciò che fa è gettata la proprietà e restituirlo come quel tipo, ma dimostra come si può lanciare a digitare T senza sapere che cosa, in particolare, T accade a essere. Poi, si può chiamare in questo modo:

Dim x As New MyType() 
Dim y As MyType2 = DoSomethingGenerically(Of MyType2)(x) 

Questo è esattamente come la classe List(Of T), e altre classi generiche simili sono implementati. Tranne, invece di fare un singolo metodo generico, fanno tutta la classe generica, per esempio:

Public Class MyList(Of T) 
    Public Sub Add(item As T) 
     ' ... 
    End Sub 
End Class 
+0

Come è principalmente diverso da CType (x, MyType2)? Più digitando - stesso risultato. Sia in generici che in CType il tipo deve essere noto al momento della compilazione. – Neolisk

+1

@Neolisk, sei corretto, anche in fase di compilazione, il tipo deve essere conosciuto per un tipo generico, ma il tipo è specificato dal chiamante piuttosto che nel metodo generico stesso. Come ho detto nella risposta, il metodo di esempio che ho mostrato è stato inutile. Era semplicemente pensato per dimostrare come funzionavano i tipi generici. –

16

Hai guardato nel metodo CTypeDynamic()? Il secondo parametro (ad esempio: il tipo) può essere impostato dinamicamente. Ottimo per quando usi Reflection.

Ad esempio:

CTypeDynamic(strValueToConvert, objTypeToConvertTo) 
+1

Questa risposta funziona per me. Come non è questa la risposta migliore? – Arvin

+1

Bene, per una ragione, il tipo di ritorno di 'CTypeDynamic' è' Oggetto', che è sfortunato ma ovviamente inevitabile. –

+0

Funziona perfettamente! – HumbleBeginnings