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 :

Caster un type générique


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Sp4ce
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Par défaut Caster un type générique
    Salut,

    j'ai un type générique et je voudrais le caster. est-ce que vous pensez que c'est possible ? Je comptais faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private T convertStringTo<T>(string value)
    {
        if (typeof(T).Equals(typeof(string)))
            return value;
        if (typeof(T).Equals(typeof(int)))
            return int.parse(value);
        // etc, etc.
        throw new Exception ("unhandle type");
    }
    Mais ça me marche pas, erreur à la compilation parce qu'il refuse de comprendre que j'ai vérifié le type T avant le return...

    Des idées ?

  2. #2
    Membre expérimenté
    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 : 47
    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
    Par défaut
    Ta méthode doit renvoyer un objet de type T alors que tu renvoies une string, un int, ... bref tout sauf un objet de type T. Normal que ça gueule.

  3. #3
    Membre confirmé Avatar de Sp4ce
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Par défaut
    Bah oui, j'avais compris le problème, merci pour l'aide

    Non, plus franchement, je trouve toujours pas, du coup je complexifie un peu plus, mais ça "gueule" au même endroit , enfin dans le même style...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    /// <summary>
    /// get a configuration as a int, store into the cache
    /// </summary>
    /// <param name="key">the name of the config</param>
    /// <param name="defaultValue">the default value if any problem occurs</param>
    /// <returns></returns>
    public T getConfiguration<T>(string key, T defaultValue)
    {
       if (typeof(T).Equals(typeof(int)))
       {
          converter<int> deleg = int.Parse;
          return cacheConfig<int>(_iConfigurations, key, defaultValue, deleg);
       }
    }
     
    /// <summary>
    /// Convertit un string dans un type donné
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value"></param>
    /// <returns></returns>
    private delegate T converter<T>(string value);
     
    /// <summary>
    /// cache the configuration into the right cache
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="cache"></param>
    /// <param name="key"></param>
    /// <param name="defaultValue"></param>
    /// <param name="convert"></param>
    /// <returns></returns>
    private T cacheConfig<T>(IDictionary<string, T> cache, string key, T defaultValue, converter<T> convert)
    {
       try 
       {
          if (!cache.ContainsKey(key))
             cache[key] = convert(_controller.AskConfiguration(key));
          return cache[key];
       }
       catch(Exception)
       {
          return defaultValue;
       }
    }

    Bon finalement je recupère mon delegate et la méthode cacheConfig<T> et je crée autant de méthode GetConfiguration que nécessaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
     /// <summary>
    /// get a configuration as a int, store into the cache
    /// </summary>
    /// <param name="key">the name of the config</param>
    /// <param name="defaultValue">the default value if any problem occurs</param>
    /// <returns></returns>
    public int GetConfiguration(string key, int defaultValue)
    {
        return cacheConfig(_iConfigurations, key, defaultValue, int.Parse);
    }
     
    /// <summary>
    /// get a configuration as a bool, store into the cache
    /// </summary>
    /// <param name="key">the name of the config</param>
    /// <param name="defaultValue">the default value if any problem occurs</param>
    /// <returns></returns>
    public bool GetConfiguration(string key, bool defaultValue)
    {
        return cacheConfig(_bConfigurations, key, defaultValue, bool.Parse);
    }
    Voili voilou

    A+

  4. #4
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    et Direcast(T,value) ?
    Sinon pourquoi ne pas créé un constructeur de T à partir d'une string ?

  5. #5
    Membre émérite
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public T getConfiguration<T>(string key, T defaultValue)
    {
       if (typeof(T).Equals(typeof(int)))
       {
          converter<int> deleg = int.Parse;
          return cacheConfig<int>(_iConfigurations, key, defaultValue, deleg);
       }
    }
    Ici tu essaye de renvoyer un objet de type cachedConfig alors que la méthode attends un objet de type T. Si tu as défini que ta méthode renverra un objet de type T alors elle doit renvoyer un objet de ce type...

    Par contre tu dois envoyer quelquechose quoi qu'il se passe...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private T cacheConfig<T>(IDictionary<string, T> cache, string key, T defaultValue, converter<T> convert)
    {
       try 
       {
          if (!cache.ContainsKey(key))
             cache[key] = convert(_controller.AskConfiguration(key));
          return cache[key];
       }
       catch(Exception)
       {
          return defaultValue;
       }
    }
    tu peux renvoyer default(T) à la place de defaultValue.

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

Discussions similaires

  1. [2.0] polymorphisme avec des types générique
    Par mister3957 dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 31/05/2007, 08h11
  2. Type générique paramétré ?
    Par Lebbihi dans le forum Langage
    Réponses: 2
    Dernier message: 15/03/2007, 09h58
  3. [Framework] IOC - Type générique
    Par seawolfm dans le forum Spring
    Réponses: 1
    Dernier message: 06/02/2007, 18h17
  4. Réponses: 12
    Dernier message: 23/09/2006, 12h12
  5. y a-t-il un support de types génériques pour python ?
    Par silverhawk.os dans le forum Général Python
    Réponses: 15
    Dernier message: 24/03/2006, 18h23

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