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

VB.NET Discussion :

Récupérer type d'une liste d'objets


Sujet :

VB.NET

  1. #1
    Membre émérite
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 746
    Par défaut Récupérer type d'une liste d'objets
    Bonjour,

    Je suis en train de reprendre un projet laissé de côté pendant un certain temps, et qui devra être utilisé d'ici peu.
    Je tombe sur un hic, je ne suis plus à la page, et je bloque sur un problème idiot.
    On a des classes d'objets divers, qui sont stockés dans ce cas précis en listes : List (of Object)
    Pour effectuer un traitement générique sur chaque List (il y en a plusieurs dizaines), j'ai bien une solution bête, faire une fonction par classe.
    Mais tant qu'à faire je préfèrerais une seule fonction qui serait valable pour toutes les classes d'où le List(of Object).
    Mon seul souci est que dans une boucle, afin d'ajouter un nouvel élément à la liste, j'ai besoin de créer un nouvel objet avec New
    Et je ne sais pas comment faire pour dire que c'est un objet de la classe de la liste.
    Voici la fonction. Elle utilise une chaîne contenant une liste d'ID enregs, et doit remplir la liste en ne tenant compte que de cet ID (les autres valeurs de la classe sont inutiles à cet instant et sont renseignées plus tard).
    J'avais bien pensé à Lst(0).GetType() pour remplacé les ??? mais çà ne va pas.
    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
        Function decode_List(str_Var As String, lst As List(Of Object)) As String
     
            ' Vide la liste
            lst.Clear()
     
            ' Eclate la chaine récupérée en liste de clés
            Dim lstSplit As List(Of String) = str_Var.Split(New Char() {","c}, StringSplitOptions.RemoveEmptyEntries).ToList()
     
            ' Remplit la liste avec les clés stockées
            For Each s As String In lstSplit
                Dim obj As New ???
                obj.Code = CInt(s)
                lst.Add(obj)
            Next
     
        End Function
    Une idée, un conseil ?
    Merci

  2. #2
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 673
    Par défaut
    bonjour,
    si tu passes l'ID dans lstSplit tu n'as pa besoin de connaître son type, du moins c'est ce que j'ai compris.

    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
    Function decode_List(str_Var As String, lst As List(Of Object), t As Type) As String
     
        ' Vide la liste
        lst.Clear()
     
        ' Eclate la chaine récupérée en liste de clés
        Dim lstSplit As List(Of String) = str_Var.Split(New Char() {","c}, _
            StringSplitOptions.RemoveEmptyEntries).ToList()
     
        ' Propriété Code du type cible (récupérée une seule fois)
        Dim propCode As Reflection.PropertyInfo = t.GetProperty("Code")
     
        ' Remplit la liste avec les clés stockées
        For Each s As String In lstSplit
            lst.Add(Activator.CreateInstance(t))
            propCode.SetValue(lst(lst.Count - 1), CInt(s))
        Next
     
    End Function

  3. #3
    Membre émérite
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 746
    Par défaut
    Ce n'est pas l'ID qui me pose souci, c'est la classe.
    Pour faire un dim obj as New ???
    Afin de pouvoir ajouter un poste à la liste.

    J'essaie d'être clair en simplifiant.
    On récupère des chaînes listant les clés (séparées par des virgules) correspondants à des enregistrements à charger.
    Pour chaque type d'enregistrement, on a une classe. Celle-ci se compose de l'ID, puis d'un certain nombre de champs, différents d'une classe à l'autre.
    Le but ici, est d'initialiser la liste en remplissant juste la clé d'enregistrement.
    Une autre fonction est ensuite chargée de compléter les postes en récupérant les enregistrements indiqués, mais elle n'intervient pas ici.

    En plus je viens de m'apercevoir que j'ai un souci de passage de paramètres.
    Je ne peux pas passer la liste en tant que List(Of Object), la fonction demande à remplacer par IEnumerable(Of Object).
    Sauf que du coup je ne peux plus ajouter mes éléments normalement.

  4. #4
    Membre émérite
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 746
    Par défaut
    Bon, je reste bloqué, même si j'ai avancé sur certains points.
    J'ai utilisé les génériques pour passer la classe : (Of T As New)
    Si je debug, à la ligne 13, obj est bien de la classe transmise.
    Mais du coup comme c'est un générique à la base, je ne peux pas coder la ligne commentée ('obj.Code = s) et du coup toutes les propriétés sont à Nothing.
    Bref, j'ai bien au final un objet de la bonne classe, mais je n'arrive pas à renseigner le champ "Code" qui figure dans toutes les classes qui utiliseront cette fonction.
    Je me dis que vu le temps perdu j'aurais mieux fait de faire mes 37 fonctions (même si l'idée me révulse).
    Il y aurait moyen de sortir de cette impasse ?

    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
        Function decode_List(Of T As New)(str_var As String, ByRef lst As IEnumerable(Of Object))
     
            ' Vide la liste
            lst.ToList.Clear()
     
            ' Eclate la chaine récupérée en liste de clés
            Dim lstSplit As List(Of String) = str_var.Split(New Char() {","c}, StringSplitOptions.RemoveEmptyEntries).ToList()
     
            ' Remplit la liste avec les clés stockées
            For Each s As String In lstSplit
                Dim obj As New T
                'obj.Code = s
                lst.Append(obj)
            Next
     
        End Function

  5. #5
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 673
    Par défaut
    bonjour,
    dans le doute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function decode_List(Of T As {IEntite, New})(str_Var As String, lst As List(Of T)) As String
        lst.Clear()
        For Each s As String In str_Var.Split(New Char() {","c}, StringSplitOptions.RemoveEmptyEntries)
            lst.Add(New T)
            lst(lst.Count - 1).Code = CInt(s)
        Next
    End Function
    si non sauf coler une interface dans toutes tes classes exitente je vois pas !

  6. #6
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    3 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 221
    Par défaut
    Si l'objet à créer dépend du contenu d'une chaine, la solution la plus logique selon moi consiste à utiliser le pattern Factory.
    Plutôt que d'utiliser Object qui est trop générique, je te suggère de créer une classe abstraite contenant ce qu'il y a de commun de partout.
    La factory renverra un objet de ce type abstrait mais créera concrètement l'un de ces descendant en fonction du contenu de la chaine.

    Si Code fait partie des propriétés commune, il sera accessible.
    Sinon, il faudra forcément passer par un cast de ce genre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If TypeOf something Is Foo Then
        Dim foo As Foo = DirectCast(something, Foo)
        ' do something with foo
    End If

  7. #7
    Membre émérite
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 746
    Par défaut
    Bon, désolé du retard pour la réponse, trop de sujets et problèmes en cours.

    Finalement, je n'arrive à rien, un problème en remplaçant un autre.
    Donc sachant que ce programme est voué à "disparaitre" l'an prochain au changement d'ERP, j'arrête de me creuser la tête et je fais une fonction (quasi identique) dédiée pour chaque classe.

    Merci encore.

Discussions similaires

  1. [VB.NET] Comment transférer une liste d'objet typé en NetTCPBinding?
    Par Dnx dans le forum Windows Communication Foundation
    Réponses: 1
    Dernier message: 24/09/2008, 12h57
  2. Créer une liste d'objets statiques dans une classe
    Par crossbowman dans le forum C++
    Réponses: 3
    Dernier message: 13/03/2006, 09h11
  3. methode qui retourne une liste d'objets du meme type
    Par anoukhan dans le forum Oracle
    Réponses: 8
    Dernier message: 12/01/2006, 18h38
  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