Custom attribute - Fonctionnement

Résolu
t00f Messages postés 64 Date d'inscription lundi 21 avril 2008 Statut Membre Dernière intervention 23 octobre 2009 - 11 juin 2008 à 13:00
t00f Messages postés 64 Date d'inscription lundi 21 avril 2008 Statut Membre Dernière intervention 23 octobre 2009 - 13 juin 2008 à 16:49
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

leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
11 juin 2008 à 13:47
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
3
t00f Messages postés 64 Date d'inscription lundi 21 avril 2008 Statut Membre Dernière intervention 23 octobre 2009
11 juin 2008 à 14:01
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{

              }
          }
    }
0
t00f Messages postés 64 Date d'inscription lundi 21 avril 2008 Statut Membre Dernière intervention 23 octobre 2009
11 juin 2008 à 14:06
J'ai oublié de préciser que je voulais sortir le traitement long de la méthode get :)
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
11 juin 2008 à 14:26
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?)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
t00f Messages postés 64 Date d'inscription lundi 21 avril 2008 Statut Membre Dernière intervention 23 octobre 2009
11 juin 2008 à 14:38
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...
0
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
11 juin 2008 à 15:32
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
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
11 juin 2008 à 16:54
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{

              }
          }
    }
0
t00f Messages postés 64 Date d'inscription lundi 21 avril 2008 Statut Membre Dernière intervention 23 octobre 2009
11 juin 2008 à 18:30
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.
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
11 juin 2008 à 19:55
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
0
t00f Messages postés 64 Date d'inscription lundi 21 avril 2008 Statut Membre Dernière intervention 23 octobre 2009
13 juin 2008 à 16:49
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+
0
Rejoignez-nous