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 :

"Personnalisation" des attributs


Sujet :

C#

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Points : 909
    Points
    909
    Par défaut "Personnalisation" des attributs
    Je viens d'écumer le web, la MSDN, la FAQ, le forum, et je n'ai pas trouvé de réponse à mes questions, pourtant relativement simples puisqu'elles portent sur le langage C#... Donc je me décide à les poser ici. Si les réponses étaient affichées en évidence sur la page d'accueil de la MSDN je suis prête à copier 100 fois que je suis une andouille. Pas dur, suffit de faire une boucle.

    1/ Puis-je imposer à un attribut de n'être utilisé que pour paramétrer des classes qui dérivent d'une certaine autre classe ?
    Ex : si je tape le code suivant, le compilateur m'envoie bouler : "Attribute 'System.AttributeUsage' is only valid on classes derived from System.Attribute".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [System.AttributeUsage(AttributeTargets.Class)]
    public class LinkedObjectAttribute //: Attribute
    {
    }
    Puis-je moi aussi paramétrer mon attribut LinkedObjectAttribute de manière à obtenir le même genre de message d'erreur si je l'applique à une classe qui n'hérite pas d'une certaine classe ou interface ?

    2/ Puis-je imposer à un attribut de n'être utilisé que sur une propriété qui possède un accesseur (get) ?


    Je pourrais faire ces vérifications (héritage, présence du get) par réflexion lors de l'exécution, au moment où j'utilise mes attributs dans le code, mais si la vérification pouvait se faire lors de la compilation ça serait bien mieux...

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Voici ce que j'ai trouvé pour le 1.
    L'attribut AttributeUsage est défini avec ces attributs là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [SerializableAttribute()]
    [IComVisibleAttribute(true)]
    [IAttributeUsageAttribute(AttributeTargets.Class, Inherited = true)]
    Donc ce n'est pas là qu'est définie la contrainte du :
    Attribute 'System.AttributeUsage' is only valid on classes derived from System.Attribute
    Par contre voici ce que contient une méthode GetCustomAttributes de la classe de base Attribute :
    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
    public static IAttribute[] GetCustomAttributes (IMemberInfo element, IType type, bool inherit)
     
    {
         if (element == null)
         {
              throw new ArgumentNullException ("element");
         }
         if (type == null)
         {
              throw new ArgumentNullException ("type");
         }
         if ((! ((Type) type).IsSubclassOf (typeof (IAttribute))) && (type != typeof (IAttribute)))
         {
              throw new ArgumentException (Environment.GetResourceString ("Argument_MustHaveAttributeBaseClass"));
         }
         MemberTypes memberTypes1 = ((MemberInfo) element).MemberType;
         if (memberTypes1 == MemberTypes.Event)
         {
              return Attribute.InternalGetCustomAttributes (((IEventInfo) element), type, inherit);
         }
         else if (memberTypes1 != MemberTypes.Property)
         {
              return (((MemberInfo) element).GetCustomAttributes (type, inherit) as IAttribute[]);
         }
         else
         {
              return Attribute.InternalGetCustomAttributes (((IPropertyInfo) element), type, inherit);
         }
    }
    Il semblerait que le test de l'héritage de Attribute soit codé en dur, et non pas un paramètre.

    Pour la question 2, je pense qu'on peut parvenir à la même conclusion, je ne pense pas que ce soit possible.

    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Points : 909
    Points
    909
    Par défaut
    Mffff
    Je m'en doutais un peu, mais je m'étais dit que je pouvais toujours essayer

    Tant pis.

    Et merci pour le temps que tu as pris à lire les codes sources pour moi

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

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