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 :

Passer un 'champ d'un objet' en paramètre d'une méthode


Sujet :

C#

  1. #1
    Membre habitué Avatar de Johann7751
    Profil pro
    Analyste Programmeur Junior
    Inscrit en
    Février 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur Junior

    Informations forums :
    Inscription : Février 2009
    Messages : 234
    Points : 142
    Points
    142
    Par défaut Passer un 'champ d'un objet' en paramètre d'une méthode
    Bonjour,

    J'ai un objet qui s'appelle Procedure.
    Cet objet comporte 15 champs qui sont tous de type string.
    Procedure.NomFichier
    Procedure.Enveloppe
    Procedure.Expediteur
    etc..


    Dans mon programme, je récupère un tableau d'objets Procedure.

    Dans le cadre d'une tâche de vérification de données avant un nouvel enregistrement :
    => J'aimerais créer une méthode qui vérifie si une donnée (un string) est déjà présente dans un champ précis de l'ensemble de mes objets Procedure. Elle renvoie un boolean 'true' si c'est le cas, et 'false' si ce n'est pas le cas.


    J'arrive à créer une méthode que voici :

    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 static bool DataAlreadyExist(Objet.Procedure [] procedures, string newData)
            {
     
                bool exist = false;
     
                // Pour toutes les procedures dans le tableau de procédures..
                for (int i = 0; i < procedures.Length; i++)
                {
                    if (newData.Equals(procedures[i].nomProcedure) == true)
                    {
                        exist = true;
                        i = procedures.Length; // instruction pour sortir de la boucle for
                    }
                }
     
                return exist;
            }
    Mais cette méthode ne m'intéresse pas car en fait je voudrais pouvoir passer en paramètre de ma fonction le champ de l'objet à analyser.
    Le but est de créer une méthode générique, pour ne pas à avoir à réécrire une méthode similaire pour chaque champ de mon objet.


    J'espère être assez clair.
    Est ce que c'est possible de faire une telle méthode ?

    Merci de votre aide.

  2. #2
    Inactif
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Algérie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 59
    Points : 73
    Points
    73
    Par défaut utiliser les generics
    Bonjour,
    Pour regler le probleme tu peux utiiser les generics. c a d : tu declares une liste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    List<Procedure> Procedures=new List<Procedure>();
    de cette faon t'auras une liste dynamique d'objets de type procedure.
    Pour regler le probleme de la recherche tu peux utiliser une extension qui est Find(). Voici un exemple de code que tu peux utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Procedure ReturnedProcedure = Procedures.Find(p=>p["Nom du champs"]==Valeur_Du_Champs);
    Cette extension te permettra de chercher un objet de type Procedure dans ta liste qui réponde à l'exigence de recherche. En ce qui Concerne le p["Nom du champs"], pour avoir cette indexation, il suffit d'implementer un indexer dans ta classe procedure.

    voici la structure d'implementation d'un indexer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public IConfigItem this[string index]
            {
                get
                {
                    //Traitement pour recuperer la proprieté (membre de la classe qui correspond au nom index
                }
                set
                {
                    //Traitement pour l'affectation de la proprieté (membre de la classe qui correspond au nom index
                }
            }
    hope it helps.
    Bon courage

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Points : 1 521
    Points
    1 521
    Par défaut
    Pour sortir d'une boucle, il y a le mot-clé "break" au lieu d'affecter le compteur à la valeur de sortie (ne jamais modifier le compteur à l'intérieur d'une boucle est une règle d'or pour éviter bon nombre d'effets de bord et bugs possibles). Concernant le problème, il y a deux façons de le résoudre : regrouper toutes les valeurs dans un Dictionary<string, string> par exemple (chaque propriété écrit dans sa propre case du Dictionary) et donc tu peux y accèder via sa clé ou sinon il y a la reflection.

  4. #4
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Pour récupérer la valeur d'un champ par son nom :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objet.GetType().GetField("champ").GetValue()

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Points : 1 521
    Points
    1 521
    Par défaut
    A préciser que si on souhaite récupérer la propriété "champ" de l'objet objet c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    objet.GetType().GetField("champ").GetValue(objet)
    et que ça retourne un object (à caster donc).

  6. #6
    Membre habitué Avatar de Johann7751
    Profil pro
    Analyste Programmeur Junior
    Inscrit en
    Février 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur Junior

    Informations forums :
    Inscription : Février 2009
    Messages : 234
    Points : 142
    Points
    142
    Par défaut
    Merci à tous !


    Voici la méthode qui doit fonctionner désormais :

    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
    # region DataAlreadyExist
     
            /// <summary>
            /// Vérifie si une chaîne de caractère existe dans le champ spécifié 'fieldName' des objets de type 'Procedure' contenus dans le tableau 'procedures'.
            /// </summary>
            /// <param name="procedures">tableau d'objet 'Procedure'</param>
            /// <param name="fieldName">chaîne de caractères représentant le nom du champ de l'objet 'Procedure' dans lequel on effectue la vérification</param>
            /// <param name="newData">chaîne de caractère dont on veut vérifier l'existence dans les champs 'fieldName' des objets 'Procedure' du tableau de procédures passé en paramètre</param>
            /// <returns>retourne 'true' si la chaîne 'newData' existe dans le champ 'fieldName' d'au moins un des objets 'Procedure' contenus dans le tableau 'procedures'. Retourne 'false' dans le cas contraire</returns>
            public static bool DataAlreadyExist(Objet.Procedure [] procedures, string fieldName, string newData)
            {
     
                bool exist = false;
     
                // Pour tout les objet 'Procedure' dans le tableau des procédures..
                for (int i = 0; i < procedures.Length; i++)
                {
                    // On met dans la chaîne 'fieldValue' la valeur du champ 'fieldName' de l'objet 'procedures[i]'
                    string fieldValue = procedures[i].GetType().GetField(fieldName).GetValue(procedures[i]).ToString();
     
                    if (newData.Equals(fieldValue) == true)
                    {
                        exist = true;
                        i = procedures.Length; // instruction pour sortir de la boucle for
                    }
                }
     
                return exist;
            }
     
            # endregion

    Johann

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

Discussions similaires

  1. Passer un objet en paramètre d'une servlet
    Par PoichOU dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 20/10/2014, 12h38
  2. RMI - Passer un objet Remote en paramètre d'une méthode
    Par benji1801 dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 13/02/2011, 16h39
  3. Passer un objet en paramètre d'une callback
    Par kelepoc dans le forum GTK+ avec C & C++
    Réponses: 7
    Dernier message: 31/08/2009, 12h40
  4. Réponses: 4
    Dernier message: 20/06/2007, 18h34
  5. Réponses: 3
    Dernier message: 22/05/2006, 10h58

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