Tester si une conversion de type est possible

Signaler
Messages postés
14655
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 février 2020
-
NHenry
Messages postés
14655
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 février 2020
-
Bonjour,

Dans un projet, j'ai une méthode qui doit tester si un objet est convertissable vers un type définit.

T GetValue<T>(...)
Les paramètres permettent de rechercher la valeur dans un dictionnaire.

Après la recherche, j'ai un objet, mais je n'en connais pas le type à l'avance.

J'aimerais savoir comment tester si un type est compatible avec un autre pour faire la conversion.

Pour les type hérités ou implémentés, Type.IsAssignableFrom fonctionne bien.

Par contre pour les conversions implicites (entre valeurs numériques (Int32 -> Int64 par exemple) ou classes avec conversions implicites configurées (mot clé "implicit"), je n'ai toujours pas trouvé autrement que essayant directement et de catcher l'exception en cas d'échec.

Try
{
 return (T)Convert.ChangeType(MaValeur, typeof(T));
}
catch (...)
{
 //Pas bon
}


Existe-t-il une méthode plus propre ?

Merci d'avance.

J'interviens principalement en VB6 et VB.NET, avec un peu de C#, mais la modération m'amène souvent sur d'autre langages.
En VB.NET pensez à activer "Option Explicit" et "Option Strict"

3 réponses

Messages postés
14266
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
25 février 2020
347
Salut, pour les types de base (int, string, bool, long, short, etc...) tu as la méthode TryParse
Pour tes classes à toi, tu pourrais la rajouter.

Comme ça tu l'appelles systématiquement
NHenry
Messages postés
14655
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 février 2020
139
Le soucis c'est que pour cela, j'ai déjà des fonctions de base, mais le but serait d'avoir une méthode que j'appelle de cette manière, afin de généraliser mes appels :
Int64 Mavar;
MaVar=GetValue<Int64>(...);

Et si le type inclu est compatible avec le Int64 (byte, int32, ...), que ça passe.
Sachant que cela peut être fait avec n'importe quel type.

Avec le Try/catch, ça passe (enfin, pour les conversions implicites, pas trop, mais bon), mais je trouve cela pas propre.
Messages postés
14266
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
25 février 2020
347
T'as beaucoup de types à gérer ?
Whismeril
Messages postés
14266
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
25 février 2020
347 > NHenry
Messages postés
14655
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 février 2020

NHenry
Messages postés
14655
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 février 2020
139
J'avais vu, mais pas cette page.
Il me semble que ça me générais une erreur de compil avec un type générique demandé.
J'essayerais Lundi (oui, j'ai pas VS.NET chez moi).
Whismeril
Messages postés
14266
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
25 février 2020
347 > NHenry
Messages postés
14655
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 février 2020

A la maison, j'ai community.

Si as ne va pas, ce qui me vient à l'esprit c'est une table ou une fichier, où sont listés quels types sont convertibles en quoi et si c'est implicite ou explicite.
Au début de la méthode, il faut consulter la table en fonction du type d'entrée et celui de sortie et router en fonction.
NHenry
Messages postés
14655
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 février 2020
139 > Whismeril
Messages postés
14266
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
25 février 2020

A ce niveau là, je réfléchirais à la méthode qui conviendrais le lieux. Je verrais Lundi, merci pour tes conseils.
NHenry
Messages postés
14655
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 février 2020
139
J'arrive à finir un peu le taf que j'ai, j'essayerais de faire le test, j'étais trop optimiste pour Lundi.
Messages postés
792
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
12 juillet 2019
7
Bonjour,
juste pour comprendre, d'après mes souvenirs, il n'y a pas un GetType dasn les bibliothèque C#.
j'ai relu ce lien: http://stackoverflow.com/questions/557340/how-to-get-the-type-of-t-from-a-generic-listt
Bonne journée