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 :

Collection generic à N niveau


Sujet :

C#

  1. #1
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 50
    Par défaut Collection generic à N niveau
    Bonjour à tous,

    Je cherche à créer une méthode qui prend en parametre un objet de type collection qui est lui même succeptible de contenir une collection etc...

    voila mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public void MyMethod<T>(ICollection<T> myObject)
    {
      foreach (T item in myObject)
                {
                    if (item is ICollection)
                    {
                        MyMethod(item );
    // mais ici ca marche pas
                    }
    }
    et l'erreur:
    Error 1 The type arguments for method 'MyMethod<T>(System.Collections.Generic.ICollection<T>)' cannot be inferred from the usage. Try specifying the type arguments explicitly

    J'ai bien essayer de 'caster' mais vu que je ne connais pas le type car ca peut etre une nouvelle collection comme un type string si on es au dernier niveau par exemple.

    Un idée ?

  2. #2
    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
    Il n'y a pas de contrainte sur T définissant qu'il implémente l'interface ICollection<T>

  3. #3
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Avec des collections non typées, tu peux faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public void MyMethod(ICollection myObject)
    {
      foreach (object item in myObject)
                {
                    if (item is ICollection)
                    {
                        MyMethod((ICollection)item);
                    }
                 // ...
                }
    }

  4. #4
    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
    Il y a un truc que je comprends pas. Tu veux vérifier qu'un élément dans une collection contient une collection cependant si tu défini :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ICollection<List<int>> collection = new List<List<int>>()
    ici queleque soit l'élement présent dans la collection, ce sera toujours un objet de type collection et donc par conséquent il implémente l'interface ICollection<T>. Pour une collection générique le type est la collection est toujours le même donc chaque élément de la collection implémentera obligatoirement ICollection<T> ou ICollection<T>.

    Pourquoi boucler un élément présent dans la collection pour voir si implémente ou pas ICollection ? Je trouve le message d'erreur plutôt logique...

    Tu peux utiliser la réflexion pour ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(typeof(T).GetInterface("ICollection")!=null)
    {
    //code
    }

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Ca peut pas marcher ton truc... un ICollection<T> ne peut contenir que des objets de type T, pas de type ICollection<T>... Par contre tu peux faire ça sans les génériques, comme propose Guulh, ça doit pouvoir marcher.

  6. #6
    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
    Citation Envoyé par tomlev Voir le message
    un ICollection<T> ne peut contenir que des objets de type T, pas de type ICollection<T>...
    Si on définit une constrainte avec ICollection<T> ça marche ^^

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par harz62 Voir le message
    Si on définit une constrainte avec ICollection<T> ça marche ^^
    Oui, mais il faut bien s'arrêter au bout d'un moment... avec cette solution les éléments de la collection seront toujours des collections, et on aura une récursivité infinie

  8. #8
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 50
    Par défaut
    Merci à tous,

    J'ai utilisé la réponse de Guulh et ca fonctionne trés bien pour ce que j'ai à faire.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 26/04/2011, 18h00
  2. VBScript : collection et suppression (niveau debutant)
    Par Jaydes dans le forum VBScript
    Réponses: 2
    Dernier message: 07/02/2010, 14h57
  3. Determiner le type de classe d'une collection generic
    Par MooGle dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 20/01/2008, 07h17
  4. [C#][2.0]Collections controls d'une form et niveau
    Par chnew dans le forum Windows Forms
    Réponses: 1
    Dernier message: 13/02/2006, 13h51
  5. [Generics][Tableaux][Collections] Tableau liste entiers
    Par MyGoddess dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 04/11/2005, 12h44

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