Custom attribute - Fonctionnement [Résolu]

Signaler
Messages postés
64
Date d'inscription
lundi 21 avril 2008
Statut
Membre
Dernière intervention
23 octobre 2009
-
Messages postés
64
Date d'inscription
lundi 21 avril 2008
Statut
Membre
Dernière intervention
23 octobre 2009
-
Bonjour à tous,

J'aimerais en savoir plus sur l'utilisation des custom attributes ( la documentation Msdn est assez pauvre à ce niveau, enfin je trouve !)

Voilà j'aimerais savoir si :
- l'attribut est executé avant la méthode qui le porte ?
- Comment appeller une fonction spéciale de l'attribut ?
- Peut-on intéragir avec un élément de la méthode / propriété ?

Exemple : Si j'ai un attribut personnalisé customAttribute qui possède une méthode modify(), comment faire pour appeller la méthode modify avant que le code de MyMethod ne soit executé ?

    [customAttribute()]
    public int MyMethod(...) {
        // Code ...

    }
A voir également:

10 réponses

Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
L'attribut n'est pas executé. je pense que tu n'as pas bien compris ce que sont les attributs en fait.
L'attribut permet simplement d'associer des métadonnées a la portion de code sur laquelle il porte. Ainsi, ton code exemple ne fais qu'appliquer la métadonnée "mymethod possède en tant que métadonnées, dans le code compilé, une instance de customattribute, ne contenant pas d'autre data que le simple fait que cet attribut est présent".
Ainsi, cest uniquement du code personnalisé qui va te permettre de réagir a la présence ou non de ton attribut (et de traiter les données potentielles de ton attribut). Ton seul moyen de faire qqch de cet attribut est d'avoir a un endroit, une méthode personnalisée, qui recherche les méthodes portant cet attribut par réflexion, et d'executer un code perso.

Typiquement, lorsque tu va, par exemple, mettre l'attribut "category" sur une propriété d'un objet graphique, cela ne fait qu'indiquer qu'une category existe sur ta propriété. si tu veux l'utiliser libre a toi. cependant, l'objet utilisé par le designer (et que tu peux utiliser par ailleurs) qui affiche les propriétés de ton objet se sert de cette propriété. tout simplement, lorsque le tableau des propriétés est chargé, il a une méhtode qui dit "je cherche les propriétés possédant l'attribut category, et je range mes propriétés en fonction de ceci dans mon affichage". mais cest tout.

bref, tes custom attributes ne te permettent que d'avoir des métadonnées utiles pour la reflexion
Messages postés
64
Date d'inscription
lundi 21 avril 2008
Statut
Membre
Dernière intervention
23 octobre 2009

D'accord, je comprends mieux l'utilité de l'attribute !

En fait, je pensais utiliser un attribut pour pouvoir, lors d'un appel à une propriété, effectuer un traitement spécial. Y'aurait-il un moyen pour faire cela (sans les attributs bien sûr) ?

Exemple :

    class Toto{
        
          private string name;

          public String Name{
             get{
                   // Effectuer un long traitement générique sur name
                   .... ?
                   // Renvoyer name;
                   return this.name;
             }
             set{

              }
          }
    }
Messages postés
64
Date d'inscription
lundi 21 avril 2008
Statut
Membre
Dernière intervention
23 octobre 2009

J'ai oublié de préciser que je voulais sortir le traitement long de la méthode get :)
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
je ne comprend pas ce que tu cherche a faire...pourquoi ne pas tout betement appeler une méthode pour ton traitement long? pour ce que tu veux faire tu ne pourras pas utiliser les attributs (et meme si tu pouvais, quel interet particulier de le faire?)
Messages postés
64
Date d'inscription
lundi 21 avril 2008
Statut
Membre
Dernière intervention
23 octobre 2009

J'aimerais répondre à un événement.

Du genre, si mon utilisateur fait un get, que le système s'arrange d'abord pour effectuer un traitement (transparent au développeur) qui charge des données, enregistre quelque chose ou autre.

En fait, je sais qu'au niveau de la sérialisation personnalisée, en utilisant l'attribut serializing, le système comprends qu'il doit utilisé la fonction pendant qu'il est en train de sérialiser. Je pensais essayer de faire un peu la même chose...
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
9
Ce que tu cherches a faire relève de l'AOP (Aspect Oriented Programming), regardes par exemple du côté de Postsharp, tu devrais trouver ton bonheur :

Postsharp


Working as designed
www.nikoui.fr
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
pourquoi ne pas juste appeler une méthode? qu'est ce qui te gene dans cette facon de faire sachant que ton traitement sera effectivement fait?

class Toto{
        
          private string name;

          public String Name{
             get{
                   PerformTruc();
                   .... ?
                   // Renvoyer name;
                   return this.name;
             }
             set{

              }
          }
    }
Messages postés
64
Date d'inscription
lundi 21 avril 2008
Statut
Membre
Dernière intervention
23 octobre 2009

Très Très intéressant ce PostSharp ! Merci beaucoup ;)

Vu que je suis un peu chiant sur les bords, je vais pas dire que pour l'instant, qu'il ne supporte pas le compact framework. Je vais essayer de mon côté voir s'il y'a des choses à faire.
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
tu n'as toujours pas répondu a ma question : pourquoi ne peux tu pas simplement appeler une méthode? je ne vois absolument pas le soucis que tu rencontres
Messages postés
64
Date d'inscription
lundi 21 avril 2008
Statut
Membre
Dernière intervention
23 octobre 2009

Je chercher à développer un framework complètement transparent à l'utilisateur. Je ne peux donc pas me permettre de dire à l'utilisateur d'appeller explicitement une fonction.

A+