Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C#] Déterminer si un objet quelconque est une liste.

Sujet résolu
    11 mai 2011 à 13:11:17

    Bonjour !

    je reviens pour un petit problème que je viens d'avoir, malgré des recherches sur Google. J'ai une fonction qui reçoit un object et j'aimerais, à l'aide de la Réflexion, déterminer si oui ou non cet object est une List. J'ai essayé plusieurs bout de code tel que :

    /// Premier essai
    public static bool IsList(object obj)
    {
        return obj.GetType() == typeof(List<>);
    }
    
    /// Second essai
    public static bool IsList(object obj)
    {
        Type objType = obj.GetType();
        if ( objType.IsGenericType )
        {
            var genericArgs = objType.GetGenericArguments();
            return objType.GetInterfaces().Contains(typeof(IEnumerable<>).MakeGenericType(genericArgs));
        }
    }
    


    Le premier ne marche pas, le second marche mais utilise beaucoup trop la Réflection à mon goût.
    • Partager sur Facebook
    • Partager sur Twitter
      11 mai 2011 à 13:54:37

      Aaah, la reflection sur des types génériques, c'est que du bonheur :p </ironie>

      En réalité le code qui teste si ton objet est une List<T> est plutôt le suivant:

      public static bool IsList(object obj)
      {
          return obj.GetType().GetGenericTypeDefinition() == typeof(List<>);
      }
      


      Reste à savoir si tu as vraiment besoin de tester si l'objet est une liste générique. Il y a des chances que vérifier si le type de l'objet implémente IList ou IEnumerable (en version non générique) soit suffisant:

      using System.Collections;
      
      public static bool IsList(object obj)
      {
          return obj.GetType().GetInterfaces().Contains(typeof(IList));
      }
      

      Tout dépend de ce que tu veux faire avec cet objet par la suite :)

      Edit: J'ai trouvé un code plus court :p
      • Partager sur Facebook
      • Partager sur Twitter
        11 mai 2011 à 13:58:20

        Le problème c'est que j'ai une erreur lorsque je fais typeof(IList) comme quoi je dois remplir les arguments génériques.
        • Partager sur Facebook
        • Partager sur Twitter
          11 mai 2011 à 14:03:02

          Tu ne travaillerais pas avec une version réduite du Framework (comme le Compact Framework ou Silverlight) par hasard ? :o Il s'agit ici de System.Collections.IList, pas de System.Collections.Generics.IList<T>.

          Au passage j'ai trouvé un code plus court pour tester si le type est une List<T> et j'ai mis à jour mon post précédent :D
          • Partager sur Facebook
          • Partager sur Twitter
            11 mai 2011 à 14:06:10

            J'avais tout simplement oublié d'ajouter le namespace System.Collections :D
            Je suis vraiment tête en l'air ...
            Merci encore Orwell ;)
            • Partager sur Facebook
            • Partager sur Twitter
              11 mai 2011 à 14:14:04

              Ou utilise le mot clé "is" il est là pour ça...
              • Partager sur Facebook
              • Partager sur Twitter
                11 mai 2011 à 14:33:50

                @Mangepain : Oui, à condition que tu connaisses le type de l'argument générique de ta liste:

                Tu peux écrire

                bool test = obj is List<int>;
                

                mais pas

                bool test = obj is List<>;
                

                ;)
                • Partager sur Facebook
                • Partager sur Twitter
                  11 mai 2011 à 15:02:35

                  Citation : Mangepain

                  Ou utilise le mot clé "is" il est là pour ça...


                  Merci ;) mais je préfère quand même obj.GetType() == typeof(T) dans le cas où T change constamment.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    11 mai 2011 à 15:24:55

                    Au temps pour moi, j'avais pas fait gaffe que c'était des collections génériques (dont tu ne connais pas le type contenu) que tu voulais tester
                    • Partager sur Facebook
                    • Partager sur Twitter
                      11 mai 2011 à 22:55:43

                      System.Collections.Generic.List<int> myList = new System.Collections.Generic.List<int>();
                      object o = myList;
                      if (o is System.Collections.IList)
                      {
                      	// ...
                      }
                      


                      Just sayin' :-°
                      • Partager sur Facebook
                      • Partager sur Twitter
                        11 mai 2011 à 23:22:07

                        Euh oui effectivement, is est utilisable avec les types non génériques, donc pas besoin de la Reflection si c'est pour tester l'implémentation de System.Collections.IList. J'aurais du y penser. >_<
                        • Partager sur Facebook
                        • Partager sur Twitter

                        [C#] Déterminer si un objet quelconque est une liste.

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown