IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Comment faire un switch sur un Type


Sujet :

C#

  1. #1
    Membre habitué Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 174
    Points
    174
    Par défaut Comment faire un switch sur un Type
    Bonjour,
    Je souhaiterais mettre dans un winform, ou plutot dans le controleur, un méthode privé qui s'occupera de traiter les exceptions.
    A l'intérieur je voudrais faire un switch sur le type de l'exception (xyzException, abcException....). Mais je ne trouve pas la syntaxe concernant le switch.
    voila ce que j'ai essayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private void GestionException(Exception e) {
                switch (e.GetType()) {
                    case typeof(StoreProcException):
                        if (MessageBox.Show(e.Message + "\nVoulez-vous la recréer?", e.GetType().ToString(), MessageBoxButtons.YesNo) == DialogResult.Yes)
                            CreerTable.creerStoreProcManquante(((StoreProcException)e).NomStoreProcManquante);
                        break;
    .......
                    default:
                        break;
     
                }
            }
    Avec ce code, cela ne veut pas compiler, déjà au niveau du switch (la valeur d'un type intégral est attendue). Et au niveau du case (une valeur de constante est attendue).

    J'ai essayé les Type.getType(e),typeof(e), Type.GetTypeCode(StoreProcException)..., sans succès.
    J'ai chercher sur la toile, et en appliquant les codes proposés cela ne fonctionne pas.

    Quelqu'un aurait-il un idée?
    Merci

  2. #2
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Le mot clé switch ne fonctionne qu'avec des valeurs intégrales (chaînes de caractères, entiers, énumérations).

    Pour faire ce que tu veux, utilise le mot clé is.
    Pas de questions techniques par MP

  3. #3
    Membre habitué Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 174
    Points
    174
    Par défaut
    OOk,

    donc je suis condamné à faire des if en cascade, et n'utiliser le if que pour des enum, entier, string.

    Merci

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par StormimOn Voir le message
    Le mot clé switch ne fonctionne qu'avec des valeurs intégrales (chaînes de caractères, entiers, énumérations).
    Techniquement, string n'est pas un type intégral... mais il est aussi supporté par switch

    Citation Envoyé par touftouf57 Voir le message
    donc je suis condamné à faire des if en cascade
    Ben si tu fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if (e is StoreProcException)
    {
        ...
    }
    else if (e is AutreException)
    {
        ...
    }
    else
    {
        ...
    }
    C'est pas tellement plus lourd à écrire qu'un switch...

  5. #5
    Membre habitué Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 174
    Points
    174
    Par défaut
    Tu as tout as fait raison. Et c'est vrai que niveau "écriture" ça se tiens.

    Mais au départ je pensais qu'on pouvait switcher sur le type. Je suis passé par les if et c'est ok.

    Merci.

  6. #6
    Membre habitué
    Inscrit en
    Mars 2005
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 131
    Points : 158
    Points
    158
    Par défaut
    Bonjour,


    y a une solution de contournement pour pouvoir utiliser l swich, c'est le faite d'appeler le tostring() du Type et l comparer avec l tostring du typeof

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    swich (e.GetType().ToString()){
     
    case typeof(montype).ToString():
     
    break;
     
     
    }

  7. #7
    Membre averti Avatar de _PascalC_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 220
    Points : 428
    Points
    428
    Par défaut
    typeof(montype).ToString() n'étant pas de nature constante ça me suprendrait très fortement que ça compile ton exemple...

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par _PascalC_ Voir le message
    typeof(montype).ToString() n'étant pas de nature constante ça me suprendrait très fortement que ça compile ton exemple...
    je confirme, ça ne compile pas... de toutes façons c'est un peu crade comme méthode

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur informatique (Débutant)
    Inscrit en
    Avril 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique (Débutant)
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 45
    Points : 47
    Points
    47
    Par défaut Autre solution ?
    Bonjour, ce sujet date un peu mais je rencontre actuellement ce problème !

    Après avoir recherché sur le net, je suis tombé sur pas mal de réponse ou la solution proposé est bien la cascade de "if else if".. Mais je suis aussi tombé quelques fois sur cette réponse ou il s'agit d'écrire deux petites classes :
    http://codingly.com/2009/10/19/switch-sur-un-type-en-c/

    Je voulais donc votre avis sur cette méthode ? La lisibilité me parait un peu lourde mais au niveau performance, est-il mieux d'utiliser la cascade de "if else" ou cette méthode ?

    Merci d'avance :-)

  10. #10
    Membre habitué Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 174
    Points
    174
    Par défaut
    Si les types correspondent à des classes sur lesquelles tu as la main, j'utiliserais plutot le DP Visitor.

    De cette façon, il n'y a plus de "If". C'est le compilateur qui t'oriente vers la bonne signature de méthode.
    Visitor

  11. #11
    Membre du Club
    Homme Profil pro
    Développeur informatique (Débutant)
    Inscrit en
    Avril 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique (Débutant)
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 45
    Points : 47
    Points
    47
    Par défaut
    D'accord, je viens de me documenter et je vois un peu la chose !
    Mais dans mon cas perso, le traitement est vraiment court et redondant, ma méthode avec if else étant déjà codée je vais la laisser comme ça..

    Mais je garde ce pattern sous le coude, et j'essaierais de la mettre en place plus tard, il pourra m'être utile !
    Merci beaucoup.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 93
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par NazOok Voir le message
    D'accord, je viens de me documenter et je vois un peu la chose !
    Mais dans mon cas perso, le traitement est vraiment court et redondant, ma méthode avec if else étant déjà codée je vais la laisser comme ça..

    Mais je garde ce pattern sous le coude, et j'essaierais de la mettre en place plus tard, il pourra m'être utile !
    Merci beaucoup.
    C'est une mauvaise pratique de tester les types. Utilises le polymorphisme. Ou si tu as des besoins spécifiques utilises, par exemple, le pattern "Etat" (cf Design Patterns).

    J'ajouterai faire des if (truc is typemachin) est extrêmement lent !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SOAP] Comment faire une requête sur un type concret ?
    Par verbose dans le forum Services Web
    Réponses: 1
    Dernier message: 17/06/2010, 13h57
  2. Comment faire une interface de ce type....
    Par SpiderAlpha dans le forum C++Builder
    Réponses: 6
    Dernier message: 30/04/2007, 13h50
  3. Réponses: 1
    Dernier message: 09/11/2006, 12h08
  4. [VB.NET] [PPC] Comment faire un formulaire sur pls pages?
    Par papy27 dans le forum Windows Mobile
    Réponses: 10
    Dernier message: 03/06/2004, 17h23
  5. [VB6][impression]Comment faire des effets sur les polices ?
    Par le.dod dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 08/11/2002, 10h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo