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 :

Boucle sur les objets de la classe


Sujet :

VB.NET

  1. #1
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut Boucle sur les objets de la classe
    Bonjour la communauté,

    Bon alors, je travail actuellement sur un programme en VB.NET, n-tiers, sur lequel je n'ai pas vraiment beaucoup de pouvoir de decisions.
    Donc en gros, on me demande de faire quelque chose, je dois trouver le moyen, donc on ne peut pas remettre en question l'architecture...


    Alors j'ai une classe (de la couche DL), qui contient des variables (shared) qui sont des objets.
    L'instanciation de ces objets se fait automatiquement en fonction des besoins.

    Mais je dois développer une procedure dans cette classe, qui va venir regarder chacun de ces objets vérifier si ils contiennent Nothing, et si ce n'est pas le cas, elle doit faire un dispose de cet objet. (pour libérer les connexions, la mémoire).

    Le problème c'est que cette classe est générer automatiquement, donc potentiellement, de nouvelles variables pourront s'ajouter à l'avenir.
    Donc je dois trouver le moyen de faire une boucle sur toutes les variables de cette classe, sans les connaitre.


    J'ai chercher du côté de la reflexion, mais je n'arrive pas a y trouver ce que je souhaite... il faut dire il y a beaucoup de choses dedans.

    Une idée serait la bienvenue ! Merci d'avance.
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  2. #2
    Membre éprouvé Avatar de Momoth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 318
    Points : 1 236
    Points
    1 236
    Par défaut
    Salut,

    Effectivement je pense que la reflexion est la bonne solution, par contre je ne maitrise pas trop cet art obscur donc je peux pas trop t'aider .

    J'ai par contre trouvé ce post qui pourrait peut être t'aider. Le but était je crois de réinitialiser toutes les propriétés d'une classe.

    Bonne journée.
    La Triforce du développement : Fainéantise, Curiosité et Imagination.

  3. #3
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut Merci
    Merci bien de la réponse, effectivement l'article que tu as trouvé à l'air de correspondre.
    Récupérer un objet, et lui affecter Nothing... Je vais regarder de plus près l'article et revenir si j'ai des résultats.

    Si il y a d'autres suggestions je prends !!
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  4. #4
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Alors je me suis basé sur l'autre poste, qui à travers Assembly, récupère les Properties, mais hélas, ce n'est pas exactement ce que je veux faire.

    Ce que je souhaite faire c'est pouvoir récupérer dynamiquement l'objet et l'une de ses méthode (dispose).
    Typiquement je voudrai un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For each variable in Me.MesVariable
     
           variable.Dispose()
     
    Next
    Sachant que Dispose() est une méthode de chacune de mes variables.

    Mais en me relisant, je me dis que ça ne va pas être possible... car comment pourrait il savoir à l'avance que la variable possède la méthode Dispose...

    Par contre j'ai vu que la méthode Finalize s'appelle tout seul lorsqu'on mets nothing dans l'objet, du coup je pourrait mettre mon code de sipose dans finalize, et utiliser la reflexion pour mettre nothing dans l'objet.

    Je vais essayer, mais je prends toujours les avis.
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,

    Peut-être ainsi

    Une classe de test
    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
    Public Class TestProp
        Public Shared ValeurShared As String =  "coucou"
        Private _ChaineAffectee As String = "Propriété affectée !"
        Public Property ChaineAffectee() As String
            Get
                Return _ChaineAffectee
            End Get
            Set(ByVal value As String)
                _ChaineAffectee = value
            End Set
        End Property
        Private _chainenothing As String = Nothing
        Public Property chainenothing() As String
            Get
                Return _chainenothing
            End Get
            Set(ByVal value As String)
                _chainenothing = value
            End Set
        End Property
        Sub dispose()
            ValeurShared = Nothing
        End Sub
    End Class
    Pour un accés aux propriétés et mettre à nothing
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        Sub litPropriete(tc As TestProp)
            For Each prop As Reflection.PropertyInfo In tc.GetType().GetProperties
                If Not tc.GetType().GetProperty(prop.Name).GetValue(tc, Nothing) Is Nothing Then
                    MessageBox.Show(prop.Name & " : " & tc.GetType().GetProperty(prop.Name).GetValue(tc, Nothing).ToString)
                    tc.GetType().GetProperty(prop.Name).SetValue(tc, Nothing, Nothing) ' affecte nothing
                    If tc.GetType().GetProperty(prop.Name).GetValue(tc, Nothing) Is Nothing Then MessageBox.Show(prop.Name & " : nothing")
                Else
                    MessageBox.Show(prop.Name & " : nothing")
                End If
            Next
        End Sub
    Pour un accés aux champs shared et mettre à nothing
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        Sub litChamps(tc As TestProp)
            For Each prop As Reflection.FieldInfo In tc.GetType().GetFields
                If Not tc.GetType().GetField(prop.Name).GetValue(tc) Is Nothing Then
                    MessageBox.Show(prop.Name & " : " & tc.GetType().GetField(prop.Name).GetValue(tc).ToString)
                    tc.GetType().GetMethod("dispose").Invoke(tc, Nothing)  ' testé ok
                    'tc.GetType().GetField(prop.Name).SetValue(tc, Nothing) ' affecte nothing 'remplacé par l'appel à la méthode
                    If tc.GetType().GetField(prop.Name).GetValue(tc) Is Nothing Then MessageBox.Show(prop.Name & " : nothing")
                Else
                    MessageBox.Show(prop.Name & " : nothing")
                End If
            Next
        End Sub
    appel pour test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            Dim t As New TestProp
            litpropriete(t)
            litChamps(t)
    J'ai regardé rapidement, j'espère que cela t'apportera quelques idées. (j'ai rajouté la partie dispose pas testé, elle fait partie de la classe à voir si on peut avoir le même principe sur la variable , mais les réponses arrivent avant que j'ai fini, alors je met déjà ça )

    Edit
    J'ai testé pour l'appel de la méthode (toujours sur la classe elle même)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                    tc.GetType().GetMethod("dispose").Invoke(tc, Nothing)  ' testé ok
    Corrigé dans le code
    Reste à voir sur la variable shared (je te laisse regarder)
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  6. #6
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut Wahou
    Wahou, ça c'est de la réponse !! Complet et testée !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       tc.GetType().GetMethod("dispose").Invoke(tc, Nothing)
    Marche très bien avec les objets statiques.

    Que dire de plus ! (merci peut être)
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  7. #7
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Citation Envoyé par mactwist69 Voir le message
    Que dire de plus ! (merci peut être)
    De rien

    Allez pour aller plus loin et accéder à la classe incluse pour appeler la méthode dispose
    Une classe qui sera incluse en shared dans la classe test
    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
    Public Class clsIncluse
        Private _Chaine As String = "classe incluse!"
        Public Property Chaine() As String
            Get
                Return _Chaine
            End Get
            Set(ByVal value As String)
                _Chaine = value
            End Set
        End Property
        Sub dispose()
            Chaine = Nothing
            ' je fais le ménage ...
            ' ...
            MessageBox.Show("Variable classe incluse libérée = Nothing")
        End Sub
    End Class

    Placé dans la classe de test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Class TestProp
        Public Shared obj As clsIncluse
        Public Shared ValeurShared As String = "coucou"
    '...
    La lecture de la classe incluse avec appel à sa méthode dispose (attention à la casse pour le nom , y est sensible puisque c'est traité par le Framework et pas vb)
    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
        Sub litChamps(tc As TestProp)
            For Each prop As Reflection.FieldInfo In tc.GetType().GetFields
                If Not tc.GetType().GetField(prop.Name).GetValue(tc) Is Nothing Then
                    MessageBox.Show(prop.Name & " : " & tc.GetType().GetField(prop.Name).GetValue(tc).ToString)
                    tc.GetType().GetMethod("dispose").Invoke(tc, Nothing)  ' testé ok
     
                    ' zone variable objet perso (donc tester si bien le cas)
                    ' message box juste pour être sur que l'on travaille avec la classe incluse
                    MessageBox.Show(tc.GetType().GetField(prop.Name).GetValue(tc).GetType().GetProperty("Chaine").GetValue(tc.GetType().GetField(prop.Name).GetValue(tc), Nothing))
                    tc.GetType().GetField(prop.Name).GetValue(tc).GetType().GetMethod("dispose").Invoke(tc.GetType().GetField(prop.Name).GetValue(tc), Nothing)
     
                    'tc.GetType().GetField(prop.Name).SetValue(tc, Nothing) ' affecte nothing
                    If tc.GetType().GetField(prop.Name).GetValue(tc) Is Nothing Then MessageBox.Show(prop.Name & " : nothing")
                Else
                    MessageBox.Show(prop.Name & " : nothing")
                End If
            Next
        End Sub
    Appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            TestProp.obj = New clsIncluse ' la classe incluse en shared
            Dim t As New TestProp
            'litpropriete(t)
            litChamps(t)
    Bon code ...
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

Discussions similaires

  1. Boucle sur les attributs d'une classe
    Par lefty972 dans le forum Langage
    Réponses: 1
    Dernier message: 21/06/2012, 19h04
  2. [AC-2002] Boucle sur les objets chart dans Userform
    Par Kriss63 dans le forum VBA Access
    Réponses: 6
    Dernier message: 03/02/2010, 09h56
  3. Macro sur Excel/Boucle sur les lettres
    Par life is magic dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 25/11/2005, 11h56
  4. Réponses: 5
    Dernier message: 24/04/2005, 04h09
  5. question de débutant sur les objets
    Par boucher_emilie dans le forum ASP
    Réponses: 3
    Dernier message: 06/08/2004, 10h51

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