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 :

[C#] Convertir le champ d'une classe en string


Sujet :

C#

  1. #1
    Membre confirmé Avatar de Marsupilami_00
    Profil pro
    Architecte logiciel
    Inscrit en
    Janvier 2007
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Architecte logiciel

    Informations forums :
    Inscription : Janvier 2007
    Messages : 102
    Par défaut [C#] Convertir le champ d'une classe en string
    Bonjour,

    Voilà ma problématique:

    j'ai une classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class TOTO
    {
      public int Id { egt; set;}
      public string raisonSociale { get; set;}
    }
    Je voudrai récupérer dans une chaine de caractère le nom du champ raisonSociale de la classe comme string nomChamp = "raisonSociale"

    J'ai utilisé la réflexion mais il faut parcourir les propriétés de classe. Moi je voudrai partir du champ lui-même

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var myVar = new TOTO();
    myVar.raisonSociale.GetType().GetProperty().name
    et ceci devrai me retourner "raisonSociale" et ça ne fonctionne pas

    Par contre en parcourant toutes les propriétés de la classe j'arrive bien à récupérer les nom des champs par getProperty de la classe.

    Est ce que quelqu'un à une idée ?

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Par défaut
    Et la méthode de parcourir les proprietes par réflexion ne te convient pas ?

    Sinon tu le nom de champs est fixe, reste la solution au combien peu élégante du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public static readonly string MonChamps = "raisonSocial";
    En fait je comprend pas vraiment le besoin ...

  3. #3
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 163
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TOTO monToto = new TOTO();
    string maRaisonSociale = monToto.raisonSociale;
    Si vraiment tu attaque plusieus types d'objet qui ont la même propriété (à vrai dire il devrai implémenter une interface commune) tu peux faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Type monType = typeof(TOTO);
    string maRaisonSociale = (string) monType.GetProperty("raisonSociale").GetGetMethod().Invoke(monToTo, new object[] { });
    Dans ce cas là tu as un effet de bord au cas ou le nom de ta propriété change donc la meilleur possibilité est de te créer un attribut à mettre au dessus de la propriété souhaité pour le retrouver par reflexion..

    Mais je te recommande d'utiliser une interface si tu as plusieurs types car la reflexion c'est vraiment pas l'idéal côté perf....

  4. #4
    Membre confirmé Avatar de Marsupilami_00
    Profil pro
    Architecte logiciel
    Inscrit en
    Janvier 2007
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Architecte logiciel

    Informations forums :
    Inscription : Janvier 2007
    Messages : 102
    Par défaut
    Citation Envoyé par dev01 Voir le message
    Et la méthode de parcourir les proprietes par réflexion ne te convient pas ?

    Sinon tu le nom de champs est fixe, reste la solution au combien peu élégante du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public static readonly string MonChamps = "raisonSocial";
    En fait je comprend pas vraiment le besoin ...
    Hello,

    J'ai un objet métier qui contient des champs métiers qui ne correspondent pas à ceux définis dans la base. J'ai donc fait avec les attributs c# un attribut nom de champ BDD pour chaque champ fonctionnel de l'objet métier. Dans le code pour éviter d'écrire en chaine de caractère le nom du champ métier j'aurais voulu utiliser le nom du champ de l'objet métier directement. Voilà le besoin.

    Je peux résoudre le problème en définissant un enum mais je décris les champs deux fois c'est dommage.

  5. #5
    Membre confirmé Avatar de Marsupilami_00
    Profil pro
    Architecte logiciel
    Inscrit en
    Janvier 2007
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Architecte logiciel

    Informations forums :
    Inscription : Janvier 2007
    Messages : 102
    Par défaut
    Citation Envoyé par GSXRider Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TOTO monToto = new TOTO();
    string maRaisonSociale = monToto.raisonSociale;
    Si vraiment tu attaque plusieus types d'objet qui ont la même propriété (à vrai dire il devrai implémenter une interface commune) tu peux faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Type monType = typeof(TOTO);
    string maRaisonSociale = (string) monType.GetProperty("raisonSociale").GetGetMethod().Invoke(monToTo, new object[] { });
    Dans ce cas là tu as un effet de bord au cas ou le nom de ta propriété change donc la meilleur possibilité est de te créer un attribut à mettre au dessus de la propriété souhaité pour le retrouver par reflexion..

    Mais je te recommande d'utiliser une interface si tu as plusieurs types car la reflexion c'est vraiment pas l'idéal côté perf....
    Hello,
    Je voudrais éviter de mettre "raisonsociale" en clair

  6. #6
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 163
    Par défaut
    Si c'est juste le nom de la propriété que tu veux (je ne comprends pas pk car dans ton exemple tu la spécifie dans ton code...) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    PropertyInfo[] props = typeof(TOTO).GetProperties();
    foreach (System.Reflection.PropertyInfo p in props)
      if(p.GetCustomAttributes(typeof(monAttribut),false))
        return p.Name;
    Dans ta classe tu auras ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class TOTO
    {
      public int Id { get; set;}
      [monAttribut]
      public string raisonSociale { get; set;}
    }
     
    [global::System.AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
    sealed class monAttribut : Attribute
    {
      public monAttribut()
      {}
    }

    Si tu veux la valeur de la propriété tu reprends le premier code que je t'ai donné de tel sorte que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    PropertyInfo[] props = typeof(TOTO).GetProperties();
    foreach (System.Reflection.PropertyInfo p in props)
      if(p.GetCustomAttributes(typeof(monAttribut),false))
        return (string)p.Invoke(monToto, new object[]{});

  7. #7
    Membre confirmé Avatar de Marsupilami_00
    Profil pro
    Architecte logiciel
    Inscrit en
    Janvier 2007
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Architecte logiciel

    Informations forums :
    Inscription : Janvier 2007
    Messages : 102
    Par défaut
    Oui mais je passe par le champ de l'objet et nom par la chaine de caractère "raisonSociale" car dans ce cas je n'ai aucune relation directe.
    Cette relation j'en ai besoin popur la bonne raison que si je change le nom du champ dans l'objet j'ai automatiquement une erreur de build. Dans le cas de l'utilisation de la chaine de caractère le build passe.

    Je vais tester votre code mais effectivement si à chaque fois je veux le nom du champ en chaine de caractère je dois parcourir la totalité des propriétés des champs ça va ramer

    A+

  8. #8
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Par défaut
    Citation Envoyé par Marsupilami_00 Voir le message
    Je vais tester votre code mais effectivement si à chaque fois je veux le nom du champ en chaine de caractère je dois parcourir la totalité des propriétés des champs ça va ramer

    A+
    En même temps il existe un truc super pratique appeler List<string> dans lequel on peux mettre en cache le résultat

  9. #9
    Membre confirmé Avatar de Marsupilami_00
    Profil pro
    Architecte logiciel
    Inscrit en
    Janvier 2007
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Architecte logiciel

    Informations forums :
    Inscription : Janvier 2007
    Messages : 102
    Par défaut
    Citation Envoyé par dev01 Voir le message
    En même temps il existe un truc super pratique appeler List<string> dans lequel on peux mettre en cache le résultat
    Oui effectivement mais je voulais éviter une couche supplémentaire si je pouvais obtenir l'info directement à partir de la classe

  10. #10
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 163
    Par défaut
    Je penses t'avoir donner la meilleur méthode
    Tu ne peux pas faire un code générique sans perdre sur les performances.
    Comme le dit dev01, en utilisant un cache tu pourras récupérer tes données de manière instantanée. Comme le nom d'un champ n'est théoriquement pas amené à être modifié en cour d'execution tu perdras un peu de temps à la première execution mais aux executions suivantes se sera instantané!

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/01/2009, 19h24
  2. [noob] sauvegardes des champs d'une classe
    Par AlienQueen dans le forum Hibernate
    Réponses: 2
    Dernier message: 21/11/2006, 03h05
  3. Récupérer les champs d'une classe
    Par gudul dans le forum Delphi
    Réponses: 3
    Dernier message: 15/10/2006, 15h01
  4. instanciation unique d'un champs dans une classe
    Par F.Victoire dans le forum Delphi
    Réponses: 4
    Dernier message: 15/06/2006, 19h34

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