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 :

Cast de liste générique


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    614
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 614
    Par défaut Cast de liste générique
    Bonjour,
    Voilà, j'expose le problème :
    soit deux objets :
    - un objet A contenant une EntityCollection<T>
    - un objet B du même type T
    - une fonction dans laquelle je dois ajouter l'objet B dans la EntityCollection<T> de l'objet A
    - la fonction prend en paramètres les deux objets ci-dessus et le nom de la propriété de l'objet A à laquelle ajouter l'objet B
    - je connais le nom de la propriété de type EntityCollection<T> à laquelle je dois ajouter l'objet de type T
    - je sais que le premier objet contient une EntityCollection<T>

    Dans ma fonction, par réflexion, j'arrive à retrouver la propriété de type EntityCollection<T> grâce à son nom.
    Maintenant que j'ai cette propriété, j'aimerais pouvoir y ajouter l'objet B.
    Mais pour cela, il me faut caster la propriété pour obtenir la fonction Add() et caster l'objet B pour pouvoir le passer à la fonction Add()

    Ca ressemblerait à ceci :
    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
     
      public class Obj1 : EntityObject
      {
        public string Name;
      }
     
      public class Obj2 : EntityObject
      {
        public string Name;
      }
     
      public class ObjetA1
      {
        public EntityCollection<Obj1> LstO1 { get; set; }
     
        public ObjetA1()
        {
          LstO1 = new EntityCollection<Obj1>();
        }
      }
     
      public class ObjetA2
      {
        public EntityCollection<Obj2> LstO2 { get; set; }
     
        public ObjetA2()
        {
          LstO2 = new EntityCollection<Obj2>();
        }
      }
     
        private void AddToList(object objA, object objB, string propName)
        {
          PropertyInfo pi = objA.GetType().GetProperty(propName);
     
          ((EntityCollection<Obj1>)pi.GetValue(objA, null)).Add((Obj1)objB);
        }
     
        private void button4_Click(object sender, EventArgs e)
        {
          ObjetA1 obj = new ObjetA1();
          Obj1 obj1 = new Obj1();
          obj1.Name = "OBJ1";
          AddToList(obj, obj1, "LstO1");
        }
    Dans AddToList il faut que je puisse remplacer Obj1 par le type réel (génériquement) de l'objet objB.
    Et là je bute sur ces cast...
    Ca devrait être possible mais il y quelque chose que je fais de travers...
    Quelqu'un aurait-il une idée de la bonne méthode à employer ??

  2. #2
    Membre très actif Avatar de polkduran
    Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 155
    Par défaut
    Essaies quelque chose comme ça, tu tireras avantage de la généricité
    Code C# : 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
    public class Obj1 : EntityObject
      {
        public string Name;
      }
     
      public class Obj2 : EntityObject
      {
        public string Name;
      }
     
      public class ObjetA<T> where T:EntityObject
      {
        public EntityCollection<T> LstO { get; set; }
     
        public ObjetA1()
        {
          LstO = new EntityCollection<T>();
        }
     
        public void AddObj(T obj){
            this.ListO.add(obj);
        }
     
      }
     
     
     
        private void button4_Click(object sender, EventArgs e)
        {
          ObjetA<Obj1> objA1 = new ObjetA<Obj1>();
          Obj1 obj1 = new Obj1();
          objA1.add(obj1);
     
          ObjetA<Obj2> objA2 = new ObjetA<Obj2>();
          Obj2 obj2 = new Obj2();
          objA2.add(obj2);
        }

  3. #3
    Membre émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    614
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 614
    Par défaut
    le problème est que ObjA1 et ObjA2 sont déjà déclarés et que je ne peux pas y toucher....

  4. #4
    Membre très actif Avatar de polkduran
    Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 155
    Par défaut
    c'est vrai que t'es alors un peu limité,

    tu peux faire sinon

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    private void AddToList<T>(EntityCollection<T> List,T obj) where T:EntityObject{
        List.add(obj);
    }
     
     private void button4_Click(object sender, EventArgs e)
        {
          ObjetA1 obj = new ObjetA1();
          Obj1 obj1 = new Obj1();
          AddToList<Obj1>(obj.LstO1 , obj1);
        }

    C'est plus propre que la reflection

  5. #5
    Membre émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    614
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 614
    Par défaut
    C'est bon, j'ai trouvé...
    Une EntityCollection<TEntity> demande un type bien précis. Par contre, elle implémente un ICollection<T> qui ne demande pas de précision quant au type.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     EntityCollection<TEntity> : RelatedEnd, ICollection<TEntity>, IEnumerable<TEntity>, IEnumerable, IListSource where TEntity : class, System.Data.Objects.DataClasses.IEntityWithRelationships
    Alors la solution est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        private void AddToEntityCollection<T>(object objA, T objB, string propName)
        {
          PropertyInfo pi = objA.GetType().GetProperty(propName);
          ((ICollection<T>)pi.GetValue(objA, null)).Add(objB);
        }
    Merci polkduran

  6. #6
    Membre émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    614
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 614
    Par défaut
    Ouais, ben ça ne joue pas... Faux espoir....
    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
    private void AddToEntityCollection<T>(object objA, T objB, string propName)
        {
          PropertyInfo pi = objA.GetType().GetProperty(propName);
          ((ICollection<T>)pi.GetValue(objA, null)).Add(objB);
        }
     
        private void button5_Click(object sender, EventArgs e)
        {
          EntityObject obj1;
          EntityObject obj2;
          string listName;
     
          //Obtention de obj1 et obj2 et listName par désérialisation
     
          AddObjectToEntityCollection(obj, obj1, listName);
     
        }
    En fait, je ne connais que le type parent des deux objets soit EntityObject.
    Je les obtient par désérialisation.
    et la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((ICollection<T>)pi.GetValue(objA, null)).Add(objB);
    geule au p'tits pois comme quoi
    Impossible d'effectuer un cast d'un objet de type 'System.Data.Objects.DataClasses.EntityCollection`1[WindowsFormsApplication10.Obj1]' en type 'System.Collections.Generic.ICollection`1[System.Data.Objects.DataClasses.EntityObject]'.

  7. #7
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Euh c'est dangereux ce que tu fais la!
    Il n'y a aucune relation d'héritage entre Obj1 et Obj2, le cast est plutot hasardeux!

Discussions similaires

  1. [PRBL]Caste une liste d'une liste d'objet
    Par stephane92400 dans le forum Langage
    Réponses: 4
    Dernier message: 07/08/2007, 21h01
  2. yield return et liste générique ?
    Par Thomas Lebrun dans le forum C#
    Réponses: 4
    Dernier message: 18/07/2007, 13h16
  3. Sélection d'un champ d'une liste générique ?
    Par chuiben dans le forum Ada
    Réponses: 2
    Dernier message: 22/03/2007, 14h36
  4. Cast de List
    Par beebop dans le forum C#
    Réponses: 4
    Dernier message: 11/01/2007, 09h06
  5. Réponses: 12
    Dernier message: 23/09/2006, 12h12

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