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 Dynamique d'une liste d'objet


Sujet :

C#

  1. #1
    Membre confirmé Avatar de luimême
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Par défaut Cast Dynamique d'une liste d'objet
    Bonjour,

    Je souhaite caster dynamiquement une liste d'objets en une liste de mon type A.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    object myInstance = ...// initialisation dynamique de mon instance de type T
    List<object>  myObjects = new List<object>();
    for( ... )
    {
      myObject = InstanciationDynamiqueObjetTypeA(strTypeA);
      myObjects.Add(myObject);
    }
    PropertyInfo pi = ...// recherche de la propriété à affecter
    pi.SetValue(myInstance, myObjects, null);
    Actuellement, avec ce code je récupère une erreur car il manque le cast.
    "Impossible de convertir l'objet de type 'System.Collections.Generic.List`1[System.Object]' en type 'System.Collections.Generic.List`1[A]'."

    Je ne peux utiliser d'interface (ex "List<IMyInterface>") car les type sur lesquels je travaille peuvent être issu de différentes classes.

    Merci d'avance pour vos suggestions.

  2. #2
    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 : 44
    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
    si tu travailles en C# 3, tu peux faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<A> myA = myObjects.Cast<A>.ToList();

  3. #3
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Citation Envoyé par luimême Voir le message
    Bonjour,

    Je souhaite caster dynamiquement une liste d'objets en une liste de mon type A.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    object myInstance = ...// initialisation dynamique de mon instance de type T
    List<object>  myObjects = new List<object>();
    for( ... )
    {
      myObject = InstanciationDynamiqueObjetTypeA(strTypeA);
      myObjects.Add(myObject);
    }
    PropertyInfo pi = ...// recherche de la propriété à affecter
    pi.SetValue(myInstance, myObjects, null);
    Il y a une chose qui me semble étrange dans ton approche. Pourquoi utiliser une collection typée d'Object ?
    Si le seul lien entre les objets de ta collection c'est qu'ils héritent de Object, alors il y a un problème de conception.

    My 2 cts.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  4. #4
    Membre confirmé Avatar de luimême
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Par défaut
    Citation Envoyé par tomlev Voir le message
    si tu travailles en C# 3, tu peux faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<A> myA = myObjects.Cast<A>.ToList();
    Pour information, je travaille sur 2.0.

    Mais, je ne sais pas si ça marcherait avec C#3 car mon type A,
    je ne le connais pas en avance, il est chargé par reflection.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    object instanceDeA = InstanceDynamiqueDeA(strTypeA);
    Type myTypeA = instanceDeA.GetType();
    List<myTypeA>
    A la compilation ça passe pas.

  5. #5
    Membre confirmé Avatar de luimême
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Par défaut
    Citation Envoyé par SaumonAgile Voir le message
    Il y a une chose qui me semble étrange dans ton approche. Pourquoi utiliser une collection typée d'Object ?
    Si le seul lien entre les objets de ta collection c'est qu'ils héritent de Object, alors il y a un problème de conception.
    My 2 cts.
    Hériter de Object n'est pas le seul lien entre les objets de ma collection.
    Tous les objets de ma collection sont tous du même type. Ils implémentent la même interface.

    Le problème est que je ne connais pas à l'avance le type des objets qu'il y'aura dans ma collection. Ces objets peuxent être issus de différents projets qui n'ont rient avoir les uns des autres, ...
    c'est pour cela que j'utilise object qui le type le plus haut.

    Par exemple, ça pourrait être :

    MonProjet 1 : LesAnimaux
    ex de type de mon projet strTypeA = "LesAnimaux.Animal"

    MonProjet 2 : LImmobilier
    ex de type de mon projet strTypeA = "LImmobilier.Appartement"

    etc....

    Je prend un exemple bidon pour vous expliquer mon besoin :
    Mes projets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Projet : Gestion
    public class Commande : IGestion
    {	public List<LigneCommande> mesLignes; 	...    }
     
    public class LigneCommande : IGestion
    {	....            }
     
    Projet : Animaux
    public class Animal : IAnimal
    {	public List<Amis> mesAmis;                 	...   }
     
    public class Amis : IAnimal
    {	....         }
    Je voudrais faire la même chose pour n'importe quel objet de mes projets,
    ça dépend de la configuration dans laquelle je suis, ça peut être des animaux, des commandes, etc ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    object myInstance = Activator.CreateInstance(" string : type de Commande");
    List<object>  myObjects = new List<object>();
    for( ... )
    {
      myObject = Activator.CreateInstance(" string : type de LigneCommande");
      myObjects.Add(myObject);
    }
    PropertyInfo pi = ...// recherche de la propriété "mesLignes" à affecter
    pi.SetValue(myInstance, myObjects, null);

  6. #6
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    euh

    si l'objet implémente une interface, tu peux caster ta liste en List<interface> ?

    Au pire, tu vérifies si l'objet implémente la méthode que tu veux par reflexion ?

    Il me semble que tu as tout pour faire ce que tu veux là ? non ?

    The Monz, Toulouse

  7. #7
    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
    Ce genre de code reposant autant sur la réflexion me laisse hautement dubitatif, mais je connais pas tes contraintes.

    Au pire, ce que tu peux essayer de faire, c'est un truc du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    IList myObjects = ChéPlusQuelleMethodeABaseDereflexionQuiCréerUneListeTypée(monType);
    for(...)
    {
    object o = InstanceDynamiqueDeA(strTypeA);
     myObjects.Add(o); // on utilise le Add de IList, qui est non typé
    }
     
    pi.SetValue(myInstance, myObjects, null);

  8. #8
    Membre confirmé Avatar de luimême
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Par défaut
    Citation Envoyé par theMonz31 Voir le message
    si l'objet implémente une interface, tu peux caster ta liste en List<interface> ?
    Ce n'est pas la même interface à tous les coups, et je ne sais pas quel interface est instancié, ça peut être IGestion, IAnimal, ITruc dans mon exemple.

  9. #9
    Membre confirmé Avatar de luimême
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Au pire, ce que tu peux essayer de faire, c'est un truc du style
    IList myObjects = ChéPlusQuelleMethodeABaseDereflexionQuiCréerUneListeTypée(monType);
    je vais essayer IList pour voir si ça marche

  10. #10
    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 : 44
    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
    ChéPlusQuelleMethodeABaseDereflexionQuiCréerUneListeTypée = Array.CreateInstance par exemple. Ca renvoie un Array, qui implémente IList

  11. #11
    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
    Citation Envoyé par tomlev Voir le message
    ChéPlusQuelleMethodeABaseDereflexionQuiCréerUneListeTypée = Array.CreateInstance par exemple. Ca renvoie un Array, qui implémente IList
    Ce qui a le gros petit inconvénient d'être de taille fixe Je l'ai pas sous la main, mais je suis persuadé d'avoir vu dans ce forum le bout de code nécessaire pour renvoyer une liste typée à partir du type. Faudrait voir la doc de Activator.CreateInstance.

  12. #12
    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 : 44
    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 Guulh Voir le message
    Ce qui a le gros petit inconvénient d'être de taille fixe Je l'ai pas sous la main, mais je suis persuadé d'avoir vu dans ce forum le bout de code nécessaire pour renvoyer une liste typée à partir du type. Faudrait voir la doc de Activator.CreateInstance.
    a priori ça doit être un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Type t = Type.GetType("System.Collections.Generic.List`1[System.String]");
    object obj = Activator.CreateInstance(t);
    (pour un List<String>)

  13. #13
    Membre confirmé Avatar de luimême
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Par défaut
    Citation Envoyé par luimême Voir le message
    je vais essayer IList pour voir si ça marche
    J'ai utilisé IList comme l'a préconisé Guulh

    Et ça marche, Nikel

    Merci pour toutes vos réponses.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/01/2015, 12h14
  2. [PRBL]Caste une liste d'une liste d'objet
    Par stephane92400 dans le forum Langage
    Réponses: 4
    Dernier message: 07/08/2007, 21h01
  3. Problème d'affichage dynamique d'une liste
    Par bor1s dans le forum ASP
    Réponses: 2
    Dernier message: 18/11/2005, 16h18
  4. Tri d'une liste d'objet CObList
    Par cjacquel dans le forum MFC
    Réponses: 1
    Dernier message: 13/07/2005, 13h50
  5. [MFC] Retourner une liste d'objets
    Par 1cado dans le forum MFC
    Réponses: 10
    Dernier message: 28/07/2003, 12h11

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