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 :

[C#][Generics] 2 Questions


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de funkydata
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 515
    Par défaut [C#][Generics] 2 Questions
    Salut,
    je suis en train (enfin j'essaye plutôt ) de faire une fonction de chargement générique. Ce que je veux obtenir est la chose suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonType MarVar = Import.Load<MonType>(MonFichier);
    La fonction "Load" utilise des "codecs" pour charger convenablement les différents types de variables. Ces codecs possèdent une propriété "Type" indiquant quel type d'objet il est destiné à importer. Donc dans ce cas présent la fonction "Load" va chercher le "codec" destiné à charger les objets de type "MonType" puis retourner un "object" qui sera le resultat de l'importation.

    1er problème : y-a-t'il un moyen d'éviter de faire un cast explicite de l'objet retourné ? actuellement je suis obligé de faire ceci pour que cela fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonType MarVar = (MonType)Import.Load<MonType>(MonFichier);
    2ème problème : En prenant le même exemple, je dois dans certains cas lier le codec à une interface ou une classe abstraite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MonType1 : MonInterface
    MonType2 : MonInterface
    Le codec est ici fait pour charger un objet "MonInterface". Comment dans ce cas tester si "MonType1" est bien un objet hérité de l'interface "MonInterface" afin que la fonction "Load" affecte bien le chargement de cet objet au bon codec ?

    Voilà j'espère avoir été clair, c'est pas vraiment facile à expliquer

  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
    Pour le 1er problème, si j'ai bien compris, procède ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public T Load<T> (T item) 
    { return item; }
    Pour le 2ème problème c'est possible en contraignant le type du paramètre au niveau de la dérivation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public void Load<T> (T item) where T : ICloneable
    { ... }
    Une erreur sera levée à la compilation si T n'implémente pas ICloneable. Très pratique le cas échéant

  3. #3
    Membre éclairé
    Avatar de funkydata
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 515
    Par défaut
    J'ai résolu le premier problème... tu m'as mis sur la voie. Je ne sais pas pourquoi je n'y avais pas penser avant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public T Load<T>(string Filename)
    {
          ....
          return (T)ImportCodecs[CodecIndex].Import(Filename);
    }
    Par contre pour le second problème il est certain que de contraindre le type aurait été le plus simple malheuresement dans mon cas ce n'est pas possible dans la mesure ou je ne connais pas à l'avance les types supportés par les codecs ni même si les objets sont ou non susceptibles d'être interfacés. Du coup tout doit se passer dans le runtime.
    Alors, j'ai trouvé une méthode pour faire ce que je veux mais je ne pense pas que ca soit trés propre ... mais ca fonctionne.

    L'appel dans la fonction Load<T> :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int CodecIndex = GetCodecIndex(typeof(T));
    La fonction :

    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
     
    private int GetCodecIndex(Type ThisType)
    {
        // Scan de tous les codecs
        for (int i = 0; i < ImportCodecs.Count; i++)
        {
            // Si le codec est affecté à un type interface...
            if (ImportCodecs[i].Type.IsInterface)
            {
                // On scan toutes les interfaces du type à tester
                Type[] Interfaces = ThisType.GetInterfaces();
                for (int j = 0; j < Interfaces.Length; j++)
                    if (Interfaces[j] == ImportCodecs[i].Type)
                        return i; // Trouvé !
            }
            // ...sinon le type assigné au codec doit être le même que celui de l'objet à créer
            else if (ImportCodecs[i].Type == ThisType)
                return i; // Trouvé
        }
     
        // Pas trouvé !
        return -1;
    }
    Voilà si quelqu'un à une méthode plus propre je prends

Discussions similaires

  1. Collections > Laquelle choisir (+ question bonus generics)
    Par ZoliveR dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 20/05/2015, 18h06
  2. Question sur les generics
    Par miya dans le forum Langage
    Réponses: 2
    Dernier message: 24/09/2014, 17h34
  3. Question au sujet des generics (Java8/Java7)
    Par joel.drigo dans le forum Général Java
    Réponses: 9
    Dernier message: 04/07/2014, 11h05
  4. Generics question basique .. mais ?
    Par michelp3 dans le forum Langage
    Réponses: 4
    Dernier message: 26/07/2013, 18h05
  5. question sur les generics
    Par yuriyan dans le forum C#
    Réponses: 4
    Dernier message: 27/12/2010, 01h12

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