Bonjour,
Comment faire, pour savoir si une variable peut être convertie vers le type d'une autre variable ?
merci d'avance
Version imprimable
Bonjour,
Comment faire, pour savoir si une variable peut être convertie vers le type d'une autre variable ?
merci d'avance
Bonjour
La question est un peu trop vague car cela dépend de la manière dont est envisagée la conversion.
Si c'est pour tester la possibilité de faire un cast, la méthode IsAssignableFrom de la classe Type peut être employée avec profit.
Si c'est pour des conversion de types numériques, les méthodes statiques CheckIfDoubleIsInteger, CheckIfSingleIsInteger de la classe Convert peuvent être utiles.
etc, etc .....
Soit le faire avec un Ctype() et récupérer l'exception.
Soit le faire avec un TryCast() qui renvoie nothing si ça passe pas.
Néanmoins l'utilisation d'une exception est à proscrire s'il s'agit de tester la valeur (c'est à dire qu'il est normal, voir fortement probable que l'opération échoue) car la gestion des exceptions est "couteuse" en temps (et peux rendre le debuggage très chiant aussi).
Je ne crois pas qu'un CheckIfxxx négatif rend la conversion impossible mais permet de vérifier s'il n'y a pas une perte de précision (je suis vraiement pas sur de ce point)
Pour etre plus claire, voici un example de ce que j'essaye de faire, je passe deux variables Var1 et Var2, peu importe leur type (string, int, booleen etc..)
je teste si var1, peut être converti en type du var 2 ou pas !!
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Sub Check_Variable_Types(Var1 As Object, Var2 As Object) Try Dim MyType as Type Dim Resultat as object MyType = GetType(Var2) Resultat=CType(Var1, MyType) 'ça ne marche pas, il dit que MyType est non défini Msgbox "Succès" Catch ex As Exception MsgBox("Impossible de convertir") End Try end sub
L'opérateur CType attend non pas une instance de Type à l'exécution, mas un type pleinement qualifié à la compilation.
et je rejoint bluedeep...
si tu veux savoir si c'est possible, il faut utiliser la reflexion en premier lieu et regarder si les variables sont équivalentes...
classes => classes,
struct => structs
type intégraux => types intégraux,
ou que des opérateurs Narrowing ou Widening soient définis, dans ce cas, les IsAssignableFrom de Type fera lui même le nécessaire pour le savoir.
De même certaines conversions ne sont pas possibles par un simples cast et nécessite des convertions, comme par exemple transformer un tableau de byte en chaine de caractères en base 64 par la classe Convert...
LOL cinemania
As - tu lu ma question ? ou c'est juste comme beaucoup sur des forums,qui aiment se la raconter sans lire ils commencent à expliquer et critiquer pour montrer qu'ils connaissent ?
Je sais très bien que ça marche pas, mais vu qu'on n'a pas compris ma question, j'ai essayé d'illustrer un peu ce qu'il me faut pour éclaircir ce que je cherche !
Je n'ai pas écris la fonction et demander chercher moi l'erreur ! Je sais que ça ne marche pas comme ça, sinon j'aurai pas poser la question sur le forum !!
La question est comment faire quelque chose qui ressemble à ça, mais qui marche, et non pas est ce que ça marche ou pas !!
De même, ma question n'est pas pourquoi ça ne marche pas, pour me dire que CTYPE attends un type prédéfini car je sais ça et ça n'a rien à voir avec ma question !
Merci en tout cas !!
Est-ce que tu as trouvé la réponse à ta question initial? Si oui merci de signaler avec le flag résolu.
Sinon personnellement il faudra me fournir plus d'information sur le contexte ou tu as besoin de faire ceci.
Parce une procédure qui simule une fonction avec pour output un messagebox ou une exception j'ai personnellement un peu de peine à voir à quoi ça sert! (même si je doute pas que c'est un extrait de code à des fin d'illustration)
Est-ce que ton objectif final est d'assigner Var2 à Var1 ? de comparer Var2 à Var1?
Non , je n'ai toujours pas de réponse !!
je t'explique :
Le but c'est d'assigner une variable à une cellule dans un dataset !
lA VARIABLE provient d'un fichier excel, donc avant de l'importer dans mon datatable, je dois savoir si son type est compatible, sinon je l'ignore et je passe a la suivante ligne
Actuellement, j'ai dans mon code un endroit où j'ai :
Code:row(actualCellIndex) = data.InnerText
A un moment dans la boucle, j'aiest une colonne de type DecimalCode:row(actualCellIndex)
et(cellule qui provient d'excel, contient des données qui ne peuvent pas etre convertie en INT donc ça plante)Code:data.InnerText
Mon idée est de vérifier si
la donnéeest convertible au type :Code:data.InnerText
Code:dt.Columns(actualCellIndex).DataType
Pour résumer , je veux savoir sipeut etre converti enCode:data.InnerText
Code:dt.Columns(actualCellIndex).DataType
A savoir que se sont des colonnes générée dynamiquement, donc je peux pas savoir le type de colonne en avance , ni le type de la variable en avance (un utilisateur peut saisir n'importe quoi dans son Excel)
Donc encore une fois je sais ce qu'il me faut et c'est :
Savoir si une Variable X d'un type quelconque est convertible vers le type d'une variable X2 d'un type quelconque . Les types je ne les saurai qu'au runtime.
Je pense que maintenant elle est claire ma question .
Bonsoir,
à regarder pour voir :
et j'ai testé rapide avec un petit bouton :Code:
1
2
3
4 Private Function Check_Variable_Types(ByVal VarA As Object, ByVal VarB As Object) As Boolean Dim result As Boolean = Comparer.Equals(VarA.GetType, VarB.GetType) Return result End Function
P.S. Cool justgreat, ici il neige et l'hiver s'installe insidieusement pour 6 mois... et c'est comme ça.Code:
1
2
3
4
5
6
7
8
9 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim var1 As Object = 2 Dim var2 As Object = 3.3 MessageBox.Show("Type de var1 : " & var1.GetType.ToString & vbCrLf & _ "Type de var2 : " & var2.GetType.ToString & vbCrLf & _ "La comparaison donne donc : " & Check_Variable_Types(var1, var2)) End Sub
Re:
Dans cette situation tu ne connais pas le type de la cellule Excel, on est d'accord sur ce point. Par contre tu connais le type de la colonne de la table dans le dataset.
Donc tu peux englobler l'instruction
dans un try catch ce qui donneCode:row(actualCellIndex) = data.InnerText
Code:
1
2
3
4
5 Try row(actualCellIndex) = data.InnerText Catch ex As Exception row(actualCellIndex) = valeurParDefaut End Try