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 :

comment initialiser une liste de ExpandoObject ?


Sujet :

C#

  1. #1
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut comment initialiser une liste de ExpandoObject ?
    Bonjour,
    J'ai actuellement le code suivant:
    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
    public class Output {
    	public IEnumerable<dynamic> catList;
    	public Output(IEnumerable<dynamic> catList) {
    		this.catList = catList;
    	}
    }
    var catList = new[] { new { name = "toto", age = 5 },
    			new { name = "titi", age = 7 },
    			new { name = "tata", age = 3 },
    			new { name = "tutu", age = 4 } }.ToList();
    Output out = new Output(catList);
    ...
    var results = out;
    foreach (dynamic item in results.catList) {
    	//utilisation de item.name et item.age
    }
    Et je cherche à transformer mon type anonyme dynamic par l'utilisation d'ExpandoObject. Je cherche la manière la plus concise pour déclarer cela. Pouvez-vous m'aider?
    Merci d'avance,

    [EDIT1]
    Ce que je voudrais c'est quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var catList = new System.Dynamic.ExpandoObject[] { new System.Dynamic.ExpandoObject() { name = "toto", age = 5 },
    			new System.Dynamic.ExpandoObject() { name = "titi", age = 7 },
    			new System.Dynamic.ExpandoObject() { name = "tata", age = 3 },
    			new System.Dynamic.ExpandoObject() { name = "tutu", age = 4 } }.ToList();
    Mais j'ai l'erreur de compilation "'System.Dynamic.ExpandoObject' does not contain a definition for 'name'" (pareil pour age bien sûr)
    Ce qui fonctionne mais que je souhaiterais raccourcir au maximum, c'est 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
    List<System.Dynamic.ExpandoObject> catList2 = new List<System.Dynamic.ExpandoObject>(); 
    dynamic NameAge = new System.Dynamic.ExpandoObject();
    NameAge.name = "toto";
    NameAge.age = 5;
    catList.Add(NameAge);
    NameAge = new System.Dynamic.ExpandoObject();
    NameAge.name = "titi";
    NameAge.age = 7;
    catList.Add(NameAge);
    NameAge = new System.Dynamic.ExpandoObject();
    NameAge.name = "tata";
    NameAge.age = 3;
    catList.Add(NameAge);
    NameAge = new System.Dynamic.ExpandoObject();
    NameAge.name = "tutu";
    NameAge.age = 4;
    catList.Add(NameAge);

  2. #2
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Tu peux te faire une méthode qui transforme tes objets anonymes en ExpandoObjet :
    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
    ExpandoObject AnonymousToExpando(object anonymous)
    {
        IDictionary<string, object> expandoDict = new ExpandoObject ();
     
        foreach (var property in anonymous.GetType ().GetProperties ())
            expandoDict.Add (property.Name, property.GetValue (anonymous));
     
        return (ExpandoObject) expandoDict;
    }
     
    // utilisation
    var catList = new List<ExpandoObject> {
        AnonymousToExpando (new  { name = "toto", age = 5 }),
        AnonymousToExpando (new  { name = "titi", age = 7 }),
        AnonymousToExpando (new  { name = "tata", age = 3 }),
        AnonymousToExpando (new  { name = "tutu", age = 4 })
    };
    faudra peut-être ajouter 2-3 vérifs à la méthode (comme elle peut accepter n'importe quel objet) mais l'idée est là

  3. #3
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    Ok c'est une bonne piste merci.
    Est-ce qu'il y a moyen que la méthode AnonymousToExpando prenne indifféremment une liste ou un objet seul? Ca éviterait les multiples appels à la méthode AnonymousToExpando.
    Sinon j'ai trouvé cette autre manière de faire qui est pas mal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var catList = new[] { 
        new { name = "toto", age = 5 },
        new { name = "titi", age = 7 },
        new { name = "tata", age = 3 },
        new { name = "tutu", age = 4 } 
    }.Select(x => {
        dynamic d = new ExpandoObject();
        d.name = x.name;
        d.age = x.age;
        return d;
    }).ToList();

  4. #4
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Tu peux si tu veux lui faire prendre une liste en argument (même si pour moi c'est donner 2 responsabilités différentes à une méthode). Le but était là de montrer une méthode générale qui fonctionne pour transformer n'importe quel objet anonyme (et d'autres objets qui "colle au profil") en ExpandoObject et éviter de la duplication de code si t'en as besoin à plusieurs endroits (ou dans plusieurs projets).
    Sinon plutôt que de faire un Enumerable.Select suivi d'un Enumerable.ToList tu pourrais utiliser List<T>.ConvertAll

  5. #5
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    Alors justement, je ne veux pas lui passer explicitement une liste d'objet. Je voudrais savoir si en lui passant un object, il y a moyen de détecter s'il s'agit d'une liste ou non. Comme ça, on pourrait passer indistinctement une liste d'objet ou juste un objet à la méthode.
    Pour ta proposition avec convertAll, je ne suis pas sûr de saisir étant donné qu'il faut donner une méthode de conversion, non? Qu'est-ce que ça donnerait en fait ici?

  6. #6
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    sauf qu'en passant directement une liste il te faudrait également une liste en sortie ou alors tu veux récupérer les propriétés de chaque élément de la liste et les "condenser" dans un seul expando ? Auquel cas, oui en explorant le type de ce qui est passé en paramètre tu peux par exemple vérifier si c'est un tableau ou s'il implémente une interface (IEnumerable ou ICollection par exemple) et de là en extraire le contenu et lancer récursivement la méthode (ou plutôt appeler une méthode privée qui aurait en plus l'expando en cours de création.

    passer d'un List<anonyme> (ou un anonyme[] vu qu'il existe aussi Array.ConvertAll) à un List<ExpandoObject> (à ExpandoObject[]) c'est bien convertir la liste (le tableau) dans un sens si tu observes la signature du délégué attendue par ConvertAll et celle attendue par Select ; elles sont similaires on prend le T en entrée et on donne un TResult (ou TOutput c'est pareil) en sortie du coup ils sont interchangeables (de la même manière qu'un Predicate<T> et un Func<T, bool> c'est similaire)

    Par conséquent tu peux remplacer uneListe.Select(transforme).ToList() en uneListe.ConvertAll(transforme) sans problème

  7. #7
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    Ok, c'est cette partie là que je ne vois pas comment faire en fait justement :-( : "vérifier si c'est un tableau ou s'il implémente une interface (IEnumerable ou ICollection par exemple)".
    L'idée c'est que ça prenne un objet en entrée et que ça ressorte un objet. Si l'objet en entrée est une liste alors il ressort une liste, si c'est un array, il ressort un array, si c'est juste un objet il ressort juste cet objet.

  8. #8
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Ok là c'est moi qui voit plus alors ; comment veux à la fois sortir un ExpandoObject et une liste ou un array ?

  9. #9
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    C'est ma question justement :-)
    Un objet ne peut-il pas pointer sur n'importe quoi? Que ce soit un simple objet ou une liste d'objet?
    du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var obj = new SimpleObject();
    ou alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var obj = new List<SimpleObject>();

  10. #10
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    déjà y'a aucune magie derrière var ça permet juste de ne pas avoir besoin de préciser le type ; car il est déduit de l'expression ; du coup obj dans ton premier exemple est de type SimpleObject et dans le second il a pour type List<SimpleObject>.
    Le seul moyen de stocker "n'importe quoi" c'est d'utiliser object (ou dynamic ce qui revient en gros au même) mais je vois pas en quoi ça aide spécialement ici parce qu'en fait je comprends pas le besoin
    Sinon il y a l'option de la méthode générique du style TResult Method<TResult>(args) mais ça implique de connaitre le type du résultat au moment de l'appel.

Discussions similaires

  1. Comment ré-initialiser une liste déroulante ?
    Par jeje22 dans le forum Access
    Réponses: 5
    Dernier message: 03/06/2009, 21h32
  2. Comment initialiser une liste déroulante d'un formulaire
    Par Blu3b3rry dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 30/07/2008, 18h55
  3. Comment initialiser une liste déroulante ?
    Par sergoi dans le forum Struts 1
    Réponses: 5
    Dernier message: 12/07/2007, 11h35
  4. Comment initialiser une liste dans la méthode reset()
    Par don'de dans le forum Struts 1
    Réponses: 10
    Dernier message: 19/03/2007, 21h17
  5. Comment initialiser une liste de composants avec une boucle ?
    Par EricSid dans le forum Composants VCL
    Réponses: 5
    Dernier message: 06/04/2005, 18h46

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