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

Contribuez .NET Discussion :

[C#]Comment déterminer si une instance hérite d'un type construit ouvert ou fermé ?


Sujet :

Contribuez .NET

  1. #1
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut [C#]Comment déterminer si une instance hérite d'un type construit ouvert ou fermé ?
    Salut,
    le framework 2.0 ne proposant pas, à ma connaissance, de méthode pour déterminer si une instance hérite d'une classe générique donnée, j'ai écrit la méthode suivante.
    Il existe bien la méthode IsSubClassOf mais elle ne permet pas d'interroger une classe générique ouverte.

    [FRAMEWORK] 2.0 et >
    [USING] System.Collections.Generic
    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
    47
    48
    49
     
     class ToolsGeneric
        {
            static Type TypeofObject = typeof(object); //permet d'effectuer une seule fois la récupération du type
            static readonly bool FirstCall= true; //Variable de classe immuable.
            /// <summary>
            /// Vérifie si un type est de la classe générique spécifiée.
            /// </summary>
            /// <param name="typeInstance">Type de la classe à vérifier</param>
            /// <param name="typeClassGenericRecherchee">Type de la classe générique recherchée. Exemple : MaClasseGeneric<> ou MaClasseGeneric<Client></param>
            /// <returns></returns>
            private static bool IsSubGenericClassOf(Type typeInstance, Type typeClassGenericRecherche, bool VerificationTypeRecherche)
            {
                //On vérifie, seulement lors du premier appel, si typeClassGenericRecherche est une classe générique
                if ((VerificationTypeRecherche) & !(typeClassGenericRecherche.IsGenericType))
                    throw new ArgumentException("La classe recherchée n'est pas une classe générique. Utilisez la méthode Type.IsSubclassOf.");
                if (typeInstance == TypeofObject)
                    return false; //Super classe atteinte sans résultat
                //La classe de typeInstance est bien une classe générique
                if (typeInstance.IsGenericType)
                     //Est-ce que le type immédiat de l'instance hérite de la classe générique recherchée. 
                     //On teste une classe générique fermée, exemple MaClasse<String,Int>
                  if (typeInstance == typeClassGenericRecherche) 
                    return true;
                       //Est-ce que le type immédiat de l'instance hérite de la classe générique recherchée. 
                       //On teste une classe générique ouverte, exemple MaClasse<,>
                  else if (typeInstance.GetGenericTypeDefinition() == typeClassGenericRecherche)
                          return true;
     
                //L'instance n'est pas une classe générique,fermée ou ouverte, ou bien n'est pas du type recherchée.
                //On contrôle l'ancêtre...
                return IsSubGenericClassOf(typeInstance.BaseType, typeClassGenericRecherche,!FirstCall);
            }
     
            public static bool IsSubGenericClassOf(Type typeInstance, Type typeClassGenericRecherche)
            {
                return IsSubGenericClassOf(typeInstance, typeClassGenericRecherche, FirstCall);
            }
     
            /// <summary>
            /// Vérifie si une instance est de la classe générique spécifiée.
            /// </summary>
            /// <param name="instance">Instance à tester.</param>
            /// <param name="classGeneric">Type de la classe générique recherchée. Exemple : MaClasseGeneric<> ou MaClasseGeneric<Client></param>
            public static bool IsSubGenericClassOf(object instance, Type typeClassGenericRecherchee)
            {
                return IsSubGenericClassOf(instance.GetType(), typeClassGenericRecherchee);
            }
        }
    Exemple d'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class Produit...
     
    public class ClasseUtilisatrice : ClasseUtilisatriceBase<Produit>...
     
     
    if (ToolsGeneric.IsSubGenericClassOf(clsUtil, typeof(ClasseUtilisatriceBase<>))
      Console.WriteLine("L'instance est dérivée du type générique {0}", typeGenerique);
    Je suppose le type suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typeof(ClasseUtilisatriceBase<>)
    identique à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typeof(ClasseUtilisatriceBase<Produit>)
    et à tous ces dérivées.

    ps:
    Débutant avec ce langage il va s'en dire que ce code peut être amélioré.

  2. #2
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Salut,

    Comptes tu rédiger un tuto sur ce sujet ou alors tu préfères mettre ta question dans la FAQ ?

    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  3. #3
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Aspic
    tu préfères mettre ta question dans la FAQ
    Je la propose pour la FAQ mais je voulais aussi d'autre avis sur ce code.
    Quant à la rédaction d'un tutoriel je ne vois pas quel pourrait en être le sujet.

  4. #4
    Membre confirmé Avatar de heid
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Mai 2002
    Messages : 388
    Points : 597
    Points
    597
    Par défaut
    Le code ne me parait pas thread safe. Si tu as deux accès concurent à ta méthode les champs TypeofObject et FirstCall étant globaux et statiques ca risque de coincer.

  5. #5
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par heid
    Le code ne me parait pas thread safe.
    Effectivement je ne me suis attardé sur cet aspect.
    Citation Envoyé par heid
    les champs TypeofObject et FirstCall étant globaux et statiques ca risque de coincer.
    Je les ai pensés comme des constantes, leurs déclarations ne sont peut être pas correcte.
    Merci pour ton retour.

Discussions similaires

  1. Réponses: 8
    Dernier message: 22/06/2008, 08h12
  2. Réponses: 4
    Dernier message: 03/05/2008, 09h56
  3. [9i] comment toujours avoir une instance dispo ?
    Par sygale dans le forum Oracle
    Réponses: 2
    Dernier message: 09/02/2007, 10h16
  4. Réponses: 3
    Dernier message: 13/12/2006, 14h03
  5. comment tester si une instance d'une fiche est creer
    Par HASSANAIT dans le forum Langage
    Réponses: 4
    Dernier message: 31/08/2005, 14h40

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