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

  1. #1
    Membre régulier
    Inscrit en
    novembre 2004
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : novembre 2004
    Messages : 334
    Points : 115
    Points
    115

    Par défaut comment tester un type générique T ?

    Bonjour,
    Cette méthode fonctionne bien sauf quand je rajoute le test "else if (typeof(T) is double?)". Le warning est "The given expression is never of the provided ('double?') type". Quand, en mode debug, j'arrive à un moment où T vaut bien "double?", il considère effectivement mon test comme faux.
    Qu'est-ce qui ne va pas et comment effectuer mon test s'il vous plaît?
    Merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    internal static T GetValue<T>(this string s)
    {
        TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));
     
        if (string.Equals("null", s) || string.IsNullOrEmpty(s) || string.IsNullOrWhiteSpace(s) || converter == null)
            return default(T);
        else if (typeof(T) is double?)
            s = s.Replace('.', ',');
     
        return (T)converter.ConvertFrom(s);
    }

  2. #2
    Membre éprouvé Avatar de tdutrion
    Homme Profil pro
    Architecte technique
    Inscrit en
    février 2009
    Messages
    561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2009
    Messages : 561
    Points : 1 081
    Points
    1 081

    Par défaut

    Bonjour,

    Je suis loin d'être expert en C#, mais le fait de dire double? veut dire double nullable, or la condition précédente (if) est vraie si T est null, donc on ne passerais jamais dans typeof(T) == double? mais typeof(T) == double. Si cette affirmation se confirme, je procéderais à la suppression du ?.

    Par ailleurs par soucis de lisibilité et de maintenabilité, je changerais le code comme ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    internal static T GetValue<T>(this string s)
    {
        TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));
     
        if (string.Equals("null", s) || string.IsNullOrEmpty(s) || string.IsNullOrWhiteSpace(s) || null == converter) {
            return default(T);
        }
     
        if (typeof(T) is double?) {
            s = s.Replace('.', ',');
        }
        return (T)converter.ConvertFrom(s);
    }

  3. #3
    Membre régulier
    Inscrit en
    novembre 2004
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : novembre 2004
    Messages : 334
    Points : 115
    Points
    115

    Par défaut

    Bonjour,
    Non, en fait la condition précédente veut dire que la chaîne s soit vaut "null", soit vaut null, soit vaut " " (n fois un espace), soit vaut "", soit il n'existe pas de converter du type donné T.
    En mode debug, je passe bien dans mon "else if", mais la condition vaut false et mon Replace ne se fait donc pas.
    Citation Envoyé par Théocrite Voir le message
    Bonjour,

    Je suis loin d'être expert en C#, mais le fait de dire double? veut dire double nullable, or la condition précédente (if) est vraie si T est null, donc on ne passerais jamais dans typeof(T) == double? mais typeof(T) == double. Si cette affirmation se confirme, je procéderais à la suppression du ?.

  4. #4
    Membre régulier
    Inscrit en
    novembre 2004
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : novembre 2004
    Messages : 334
    Points : 115
    Points
    115

    Par défaut

    En fait, je viens de résoudre mon problème en mettant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    else if (typeof(T) == typeof(double?))
    Cependant je ne comprends pas pourquoi mon code précédent ne marchait pas... Si quelqu'un peut m'expliquer, je suis preneur.

  5. #5
    Membre expérimenté
    Avatar de Ph_Gr
    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2013
    Messages
    409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

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

    Informations forums :
    Inscription : novembre 2013
    Messages : 409
    Points : 1 319
    Points
    1 319

    Par défaut

    Citation Envoyé par jmclej Voir le message
    En fait, je viens de résoudre mon problème en mettant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    else if (typeof(T) == typeof(double?))
    Cependant je ne comprends pas pourquoi mon code précédent ne marchait pas... Si quelqu'un peut m'expliquer, je suis preneur.
    Bonjour,
    En fait l'opérateur "is" est fait pour tester directement si la variable concernée est du type T ou d'un dérivé, comme par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    FileStream fs = File.Open("test.txt",FileMode.Open);
     
    bool bTest = (fs is Stream); //Toujours vrai car la variable fs est d'un type dérivé de Stream.
    Et quand tu testes "Typeof(T) is typeof(double?)", ce sera donc toujours forcément faux car "Typeof(T)" est de type "Type", et donc forcément ne peux pas être de type "double" ni "double?", etc...
    C'est pourquoi corriger comme tu l'as fait c'est bien la bonne solution.
    Philippe

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

Discussions similaires

  1. comment tester le typed'un champ avant de le changer?
    Par korntex5 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 15/06/2007, 17h52
  2. Réponses: 9
    Dernier message: 16/11/2006, 14h08
  3. comment tester si une variable est de type indifined
    Par amelhog dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 10/08/2005, 09h32
  4. [Excel] Comment tester le type de champ ?
    Par natie_49 dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 17/06/2005, 15h17
  5. Réponses: 10
    Dernier message: 18/11/2003, 18h01

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