NHenry
Messages postés15102Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention27 mars 2024
-
Modifié par NHenry le 24/04/2015 à 15:15
NHenry
Messages postés15102Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention27 mars 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.
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"
Whismeril
Messages postés18992Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention29 mars 2024654 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
NHenry
Messages postés15102Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention27 mars 2024159 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.
Whismeril
Messages postés18992Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention29 mars 2024654 24 avril 2015 à 19:21
T'as beaucoup de types à gérer ?
NHenry
Messages postés15102Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention27 mars 2024159 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 ?
Whismeril
Messages postés18992Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention29 mars 2024654
>
NHenry
Messages postés15102Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention27 mars 2024 24 avril 2015 à 20:16
NHenry
Messages postés15102Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention27 mars 2024159 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).
Whismeril
Messages postés18992Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention29 mars 2024654
>
NHenry
Messages postés15102Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention27 mars 2024 24 avril 2015 à 20:46
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és15102Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention27 mars 2024159
>
Whismeril
Messages postés18992Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention29 mars 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.
24 avril 2015 à 19:13
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.