Tester si une conversion de type est possible

NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 - Modifié par NHenry le 24/04/2015 à 15:15
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 - 28 avril 2015 à 12:31
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

Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
24 avril 2015 à 19:01
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
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
24 avril 2015 à 19:13
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.
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
24 avril 2015 à 19:21
T'as beaucoup de types à gérer ?
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
24 avril 2015 à 19:40
Surtout, c'est totalement définissable par le développeur (on est 2 sur le projet).
Je ne peux pas forcément prévoir tout les types, j'ai les types de base, l'exception, ..., et plus d'une dizaine de classes utilisateur (avec sous objets perso) et cela évoluera.

Actuellement, j'ai un champ qui m'indique le type de l'objet (texte), cela déclenche un appel à une méthode statique (découvert automatiquement par attribut de classe [...] et Reflection) pour recréer l'objet avec les données disponibles.

Hors, cet appel peut se faire sans préciser le type désiré, car j'ai des méthodes qui permettent de demander l'objet contenu, cela renvoi le dictionnaire de données si aucun objet n'a pu être créé.

Et pour autant, si je force le type désiré, j'aimerais ne pas avoir à faire 2 méthodes de décodage (avec et sans le type demandé), le projet est déjà assez complexe.

Cela est une sérialisation perso, mais qui type fortement si disponible (contrairement à XML/JSON) et n'oblige pas à avoir les classes qui vont en face (manipulation/consultation en direct des données possible), afin d'éviter les problème de dépendances et d'évolution.

Dans le cas de type compatible, il faut que je ne jette pas si cela est faisable, actuellement, je le fais avec un Try/Catch, que je ne trouve pas terrible.

Est-ce que cela te permet de mieux cerner le besoin ?
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656 > NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024
24 avril 2015 à 20:16
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
24 avril 2015 à 20:26
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).
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656 > NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024
24 avril 2015 à 20:46
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.
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159 > Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024
24 avril 2015 à 23:38
A ce niveau là, je réfléchirais à la méthode qui conviendrais le lieux. Je verrais Lundi, merci pour tes conseils.
0
cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 8
27 avril 2015 à 08:45
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
0
Rejoignez-nous