Tester si une conversion de type est possible

Signaler
Messages postés
14725
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
22 septembre 2020
-
Messages postés
14725
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
22 septembre 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
14775
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
24 septembre 2020
435
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
Messages postés
14725
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
22 septembre 2020
144
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
14775
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
24 septembre 2020
435
T'as beaucoup de types à gérer ?
Messages postés
14775
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
24 septembre 2020
435 >
Messages postés
14725
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
22 septembre 2020

Messages postés
14725
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
22 septembre 2020
144
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).
Messages postés
14775
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
24 septembre 2020
435 >
Messages postés
14725
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
22 septembre 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.
Messages postés
14725
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
22 septembre 2020
144 >
Messages postés
14775
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
24 septembre 2020

A ce niveau là, je réfléchirais à la méthode qui conviendrais le lieux. Je verrais Lundi, merci pour tes conseils.
Messages postés
14725
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
22 septembre 2020
144
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
8
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