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 :

Récupérer dynamiquement la valeur d'un attribut à partir de son nom


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Higgins
    Inscrit en
    Juillet 2002
    Messages
    539
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 539
    Par défaut Récupérer dynamiquement la valeur d'un attribut à partir de son nom
    Bonjour tout le monde,

    Voici mon problème:
    J'aimerai récupérer dynamiquement la valeur d'un attribut dans une classe. J'ai trouvé dans la Faq comment retrouver l'attribut, je ne sais pas retrouver la valeur.
    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
     
    class maClasse
    { String maVar;
       MemberInfo AttributFromName(string param)
            {
                MemberInfo[] attributs=this.GetType().GetMembers();
                foreach (MemberInfo mInfo in attributs)
                { 
                    if (mInfo.ToString().Equals(param))
                    {                  
                        return  mInfo;}
                }
                return null;
     
     
           }
    }
    Lorsque je fait l'appel suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    maClasse test= new maClasse();
    MemberInfo monattribut = test.AttributFromName("maVar")
    Je retrouve bien l'attribut, je peux récupérer le type et plein d'autres infos mais pas sa valeur.
    Quelqu'un saurait-il comment faire?

  2. #2
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Par défaut
    salut,

    il te suffit de caster ton attribut, voici un exemple d'utilisation avec un attribut personnalisé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    foreach (object customAttribute in info.GetCustomAttributes(typeof(SsvFieldMapping), true))
                            {
                                SsvFieldMapping mapping = (SsvFieldMapping)customAttribute;
                                currentIndex = mapping.CsvIndex;
                            }

  3. #3
    Membre éclairé
    Avatar de Higgins
    Inscrit en
    Juillet 2002
    Messages
    539
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 539
    Par défaut
    Désolé, je n'ai rien compris

    Dans ton exemple, "info" est-il du type "MemberInfo"?
    A quoi correspond "SsvFieldMapping"?

    J'ai essayé d'adapter ton code comme-ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    MemberInfo monAttribut= AttributFromName("Nom");
    Type leType = monAttribut.GetType();
    foreach (object customAttribute in monAttribut.GetCustomAttributes(leType, true))
               {
                   leType mapping = (leType)customAttribute;
     
                  resultat= mapping.ToString();
               }
    Mon premier problème est que ça ne compile pas à cause de
    leType mapping = (leType)customAttribute;
    Le deuxième problème est que même si je supprime cette ligne, la boucle "foreach" reste désespérement vide.

  4. #4
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Par défaut
    Salut,

    Tout d'abord sais-tu quel type d'attributs vu-tu récupérer la valeur, ou au contraire faut'il récuperer tous les attribut quels qu'il soient ?

    si c'est la seconde version, il va te falloir beaucoup de code et de la reflexion dans tous les sens...

    Si par contre tu sais d'avance de quel type d'attribut tu veux récuperer les données c'est bien plus facile :
    Dans ton foreach où tu parcoures les attributs il faut tester si l'attribut en question est du type attendu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    foreach (MemberInfo mInfo in attributs)
                { 
                    if (mInfo.GetType().Name== "LeTypeAttendu")  //je crois que c'est name pour obetenir le nom de la class au lieu de namespace complet
                    {                  
                        ..
                    }
                }
    Puis tu cast mInfo en ce type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LeTypeAttendu monAttribut = (LeTypeAttendu)mInfo;
    Enfin, a partir de cette instance de LeTypeAttendu, tu peux accéder aux valeures définies:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string prout = monAttribut.Valeur; //par exemple

  5. #5
    Membre éclairé
    Avatar de Higgins
    Inscrit en
    Juillet 2002
    Messages
    539
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 539
    Par défaut
    Dans l'absolu, je ne connais ni la classe, ni l'attribut.
    L'objectif est de permettre à l'utilisateur de "personnaliser" son utilisation de l'application.
    Par exemple, s'il veut voir un certain nombre de "propriétés" dans un tableau excel, il indique dans les cellules concernées le nom de la propriété (et la classe) et l'application remplit ensuite le fichier Excel avec les bonnes valeurs.
    L'autre utilisation serait du "scripting" pour des traitements par lot, du type
    " foreach (maclasse where mapropriete="editable") Edite();

    Je cherche à créer un mécanisme suffisamment générique pour qu'il soit applicable à toutes mes classes futures, d'où l'idée de récupérer "en aveugle" les propriété pour lire les valeurs et les retourner à l'utilisateur.

  6. #6
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Par défaut
    Tout d'abord une question:
    Comment veux qu'un utilisateur personnalise une application en modifiant du code en dur ?
    => tu veux modifier les valeures des attributs de manière dynamique ?

    Il ne serait pas beaucoup plus simple de mettre en place de comportement au niveaux des classes, en heritant d'une classe mère qui a un ensemble de propriétés décrivant le comportement à adopter ?

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/11/2009, 08h42
  2. [XSLT] obtenir la valeur d'un noeud à partir de son nom
    Par gambic dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 20/10/2009, 11h10
  3. [EVAL] utiliser la valeur d'une variable à partir de son nom
    Par Julien Dufour dans le forum VBA Access
    Réponses: 0
    Dernier message: 24/04/2008, 13h15
  4. Récuperer la valeur d'une variable à partir de son nom
    Par Etanne dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 20/10/2007, 18h04
  5. Valeur d'un champ à partir de son nom
    Par marc_os dans le forum 4D
    Réponses: 5
    Dernier message: 07/09/2007, 15h54

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