2008-10-30 18 views
14

Je voudrais être en mesure de lancer une valeur dynamiquement où le type est connu uniquement au moment de l'exécution. Quelque chose comme ceci:Casting dans VB.NET

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

La chaîne qui contient la valeur de type est passé comme argument et est également lu à partir d'une base de données et la valeur est stockée sous forme de chaîne dans la base de données.

Est-ce possible?

Répondre

7

Bien sûr, mais myvalue devra être défini comme du type Object, et vous ne le voulez pas nécessairement. C'est peut-être un cas mieux servi par les génériques.

Qu'est ce qui détermine quel type sera utilisé?

+0

juste une chaîne indiquant le type "String", "integer", "boolean" – Youssef

+0

Alors qu'est-ce qui définit la chaîne? –

+0

la chaîne est passée en argument – Youssef

4

Eh bien, comment déterminez-vous quel type est requis? Comme Joel l'a dit, c'est probablement un cas pour les génériques. La chose est: puisque vous ne connaissez pas le type au moment de la compilation, vous ne pouvez pas traiter la valeur retournée de toute façon, donc le casting n'a pas vraiment de sens ici.

2

Peut-être que plutôt que de lancer dynamiquement quelque chose (ce qui ne semble pas fonctionner), vous pouvez utiliser la réflexion à la place. Il est assez facile d'obtenir et d'invoquer des méthodes ou des propriétés spécifiques.

Dim t As Type = testObject.GetType() 
Dim prop As PropertyInfo = t.GetProperty("propertyName") 
Dim gmi As MethodInfo = prop.GetGetMethod() 
gmi.Invoke(testObject, Nothing) 

Ce n'est pas joli mais vous pourriez faire une partie de cela en une ligne au lieu de tant.

5

C'est le moyen le plus court de le faire. Je l'ai testé avec plusieurs types.

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 

Il est un peu hacky mais cela fonctionne.