Déclaration de type à l'éxécution

BasicZx81 Messages postés 140 Date d'inscription samedi 5 mars 2011 Statut Membre Dernière intervention 13 août 2013 - 23 juin 2012 à 18:16
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 - 24 juin 2012 à 01:46
Bonjour à tous,
je cherche à typer une variable dont le type est connu seulement à l'exécution du programme.

j'ai essayé 2 façons différentes :
- La première serait de passer en paramètre le type dans MyTypeCode lors de la déclaration de ma variable mais ça ne fonctionne pas :
Dim MyVar1 As New clsVarTypeDB(Of MyTypeCode)(Paramétres) ' Cette Ligne ne fonctionne pas, MyTypeCode n'est pas accepté en tant qu'argument


- La deuxième serait de faire une conversion ou un transtypage d'une variable Object :
Dans ce cas pour bien faire il faudrait pouvoir typer la variable même si celle-ci est égale à Nothing au départ (mais je ne sais pas si c'est possible)
        Dim MyVar2 as Object
        Myvar2 Convert.ChangeType(MyVar2, MyTypeCode) ' Cette Ligne ne fonctionne pas si Object Nothing
        Myvar2 = CType(MyVar2, MyTypeCode) ' Cette Ligne ne fonctionne pas, MyTypeCode n'est pas accepté en tant qu'argument.
        MyVar2 = TryCast(MyVar2, MyTypeCode) ' Cette Ligne ne fonctionne pas, MyTypeCode n'est pas accepté en tant qu'argument


MyTypeCode peut être égale = Typecode.String, Typecode.Boolean, Typecode.single, Typecode.Integer...etc

merci beaucoup si vous avez une idée.

12 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
23 juin 2012 à 18:27
Bonjour,
dont le type est connu seulement à l'exécution du programme

et de quelle manière certaine ce type est-il connu ?
Il est certes toujours possible de tester si une chaîne de caractères peut ou non correspondre à tel ou tel autre type (et passer tous les types "en revue"), mais comment distinguer avec assurance que, par exemple et entre autres, "12345678" est un nombre et non un code identificateur ?

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
BasicZx81 Messages postés 140 Date d'inscription samedi 5 mars 2011 Statut Membre Dernière intervention 13 août 2013
23 juin 2012 à 18:58
Bonsoir et merci de me répondre.
C'est pour construire une classe qui transforme une DataRow quelconque en autant de variables qu'il y a de colonnes.
Au moment de la construction je passe en paramétre la DataRow et je vais lire chaque colonnes pour obtenir son type, ce n'est qu'a ce moment là que je peux typer ces variables.
0
Utilisateur anonyme
23 juin 2012 à 19:03
Bonjour,

Ton aide est ta meilleure amie:

Rubrique : TypeOf, Opérateur (Visual Basic)

Et puis si tu fais partie de ceux qui pensent que de regarder dans l'aide, ce n'est pas viril, ce n'est pas sexy ou que cela fait mourrir regarde là.
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
23 juin 2012 à 19:08
Bonjour,

Si tu regardes comment est constitué un DataReader, tu verras qu'il y a plusieurs méthodes :
GetValue(...)
GetInt32(...)
GetString(...)

A toi de vois si ça peut te convenir.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BasicZx81 Messages postés 140 Date d'inscription samedi 5 mars 2011 Statut Membre Dernière intervention 13 août 2013
23 juin 2012 à 19:54
Bonjour, je ne l'avais pas précisé mais j'arrive à obtenir le type avec :
Dim MyTypeCode as Typecode
MyTypeCode = Type.GetTypeCode(Row(ColName).GetType())


En fait pour chaque colonne du dataRow je crée 3 variables qui correspondent à 3 versions (Original, Current et Défaut)
C'est la version Défaut qui me pose problème puisque si la valeur par défaut n'est pas renseignée (= Nothing) je souhaite pouvoir quand même écrire une valeur par défaut dans le DataRow basé sur le type de la colonne. je ne souhaite pas écrire DBNull dans ce cas (j'ai une autre fonction pour ça) mais il faut pouvoir écrire "0.0" si c'est un single par exemple. Et comme le type n'est pas connue à l'avance je suis obligé de travailler sur des Variables Object ou Générique au départ.
(j'ai choisi l'exemple de type Single car il traduit bien ce que doit retourner une variable typé quand on lui affecte la valeur Nothing).

Merci à vous si vous avez une idée.
0
BasicZx81 Messages postés 140 Date d'inscription samedi 5 mars 2011 Statut Membre Dernière intervention 13 août 2013
23 juin 2012 à 20:31
ReBonsoir, j'ai fait ça mais j'au été obligé d'énumérer les types, du coup j'ai peur d'oublier des types. J'aurais préféré faire une conversion directe.
Si vous avez une meilleure solution ça m'interresse beaucoup.
 Defaut = GetVarType(Defaut, _TypeCode)


    Private Function GetVarType(ByVal Value As Object, TypeCode As TypeCode)
        Dim _value As Object = Nothing
        Select Case TypeCode
            Case System.TypeCode.Boolean
                _value = CType(Value, Boolean)
            Case System.TypeCode.DateTime
                _value = CType(Value, DateTime)
            Case TypeCode.Int32
                _value = CType(Value, Int32)
            Case System.TypeCode.Single
                _value = CType(Value, Single)
            Case System.TypeCode.String
                _value = CType(Value, String)
        End Select
        Return _value
    End Function
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
23 juin 2012 à 20:57
Je t'invite a relire mon message plus haut, et plus particulièrement ce passage :
peut ou non correspondre à tel ou tel autre type (et passer tous les types "en revue")

j'ignore totalement dans quelles curieuses circonstances tu en arrives à ce "mécanisme" surprenant, mais j'aurais assez tendance à dire que tu glisses ainsi vers la possibilité de nombreuses "surprises" désagréables.
Enfin, .... ce n'est que mon impression personnelle, hein ...
La seule logique sans faille que je connaisse n'est pas la "reconnaissance" d'un type, mais la décision de typer.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
23 juin 2012 à 21:06
M'enfin quoi ! ==>>
- Si je veux mettre un buisson de couleur rouge dans mon jardin, je peux décider d'y planter un rosier buisson à roses rouges. Ce sera MA décision !
- si, par contre, je pose mon regard sur le jardin de mon voisin et que j'y vois un buisson rouge, rien ne m'autorise à décréter qu'il est un rosier buisson à roses rouges.
Comment cette logique de base pourrait-elle ne pas s'imposer dès lors qu'il s'agit d'informatique ? ===>> je ne comprendrai jamais ce type de "démarche" !


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
23 juin 2012 à 21:14
Il faudrait, dans ton "cas" au moins une convergence (un faisceau) renforçant la "probabilité".
Exemple (salut marcotte) :
Depuis un avion survolant les laurentides, tu aperçois au tout début du printemps, dans une clairière, des points noirs. Que sont-ils ?
Réponse avec convergence de probabilités : ===>>
- s'ils bougent : ce sont des corneilles
- s'ils ne bougent pas : ce sont des employés de la voirie
CQFD et ===>> je sors ===>>

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
BasicZx81 Messages postés 140 Date d'inscription samedi 5 mars 2011 Statut Membre Dernière intervention 13 août 2013
23 juin 2012 à 21:23
C'est très juste ucfoutu, c'est la réflexion que je me faisais ce soir.
Je voulais améliorer une Classe basé sur le même principe et qui fonctionne à merveille sauf que avant je définissais chaque colonne individuellement de cette façon :

Dim VarColonne1 As New clsVarTypeDB(Of String)(Row, "Colonne1")
Dim VarColonne2 As New clsVarTypeDB(Of Boolean)(Row, "Colonne2")

Cette classe étais basé sur les Génériques, ainsi je définissais le type en "dûre" dans le code et la classe se débrouillé avec.

Cette fois je voudrais pouvoir construire un Objet global contenant chaque Variable (varColonne1, varColonne2...etc) et je voudrais que ma classe se débrouille pour obtenir les types à partir d'un DataRow que je passe en paramètre au constructeur de cette classe mais je vois mal comment je peux faire.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
23 juin 2012 à 21:37
Tu vas te trouver tout simplement dans la situation dans laquelle se trouve un douanier :
- La déclaration, ce n'est pas lui, qui la fait. Il ne déclare rien, lui ! Il fait un constat (il compare la déclaration du "contrôlé" avec ce qu'il trouve dans ses valises).
- C'est le voyageur (et lui seul) qui fait une déclaration de ce qu'il dit transporter.
Il en va de même en ce qui concerne ton problème et donc :
Déclaration de type à l'éxécution

reste assez rêveur. C'est cela, que je veux dire.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
24 juin 2012 à 01:46
Bonjour,

Dans ton exemple de code, tu ne respecte pas le point 3 de ma signature :
En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).

Si tu l'avais fait, tu aurais remarqué que tu aurais du déclarer ta fonction comme Object !!!

Dans ce cas, tu prend un type Object, tu le cast en String(par exemple), pour le transformer en Object (lors du retour de la fonction), ton approche est vouée à l'échec ou à l'incohérence.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
0
Rejoignez-nous