Comment travailler avec des attributs en C #

Les attributs sont une fonctionnalité puissante du langage de programmation C # qui peut ajouter des informations de métadonnées à vos assemblys.

Un attribut est en fait un objet associé à l'un de ces éléments: Assembly, Class, Method, Delegate, Enum, Event, Field, Interface, Property et Struct. Ils peuvent être utilisés pour associer des informations déclaratives - vous pouvez récupérer ces informations au moment de l'exécution à un moment ultérieur si nécessaire en utilisant la réflexion. En d'autres termes, vous pouvez utiliser des attributs pour injecter des informations supplémentaires aux assemblys qui peuvent être interrogées au moment de l'exécution si nécessaire à l'aide de la réflexion. Un attribut comprend son nom et éventuellement une liste de paramètres. Le nom d'attribut correspond à la classe d'attributs.

Vous pouvez tirer parti des attributs pour valider les objets métier dans votre application. Il existe deux types d'attributs: les attributs intrinsèques et les attributs personnalisés. Alors que le premier est disponible dans le cadre du framework .Net, le second peut être implémenté en dérivant une classe de la classe System.Attribute. Le MSDN déclare: "Un attribut est un élément d'information déclarative supplémentaire qui est spécifié pour une déclaration."

Passons maintenant au code. L'attribut Obsolete peut être utilisé pour désigner une méthode comme obsolète - une méthode qui ne devrait plus être utilisée car elle n'est plus nécessaire ou peut avoir une autre alternative. L'extrait de code suivant illustre comment vous pouvez utiliser l'attribut Obsolete au-dessus d'une déclaration de méthode.

[Obsolete("This method is obsolete...")]

        public static void DoSomeWork()

        {

            //Some code

        }

Si vous utilisez cette méthode dans votre code et compilez votre programme, un avertissement s'affiche dans la fenêtre de sortie de l'IDE de Visual Studio. Vous pouvez donc ignorer cet avertissement si vous le souhaitez. Maintenant, que faire si vous voulez que vos développeurs n'utilisent pas du tout cette méthode? Eh bien, vous pouvez ensuite utiliser le deuxième paramètre (c'est facultatif cependant) tout en déclarant l'attribut Obsolète. Voici la version modifiée de la méthode DoSomeWork (). Notez l'utilisation du paramètre booléen cette fois.

[Obsolete("This method is obsolete...", true)]

        public static void DoSomeWork()

        {

                       //Some code

        }                                                                                                                        

Lorsque vous passez "true" comme deuxième paramètre facultatif cette fois et que vous compilez votre programme, le code ne se compilera pas du tout. C'est ce que tu voulais faire, n'est-ce pas?

Attributs personnalisés

Dans cette section, nous explorerons comment nous pouvons implémenter des attributs personnalisés. Les attributs personnalisés sont des classes qui héritent de la classe System.Attribute. Ainsi, pour implémenter une classe d'attributs personnalisée, créez une nouvelle classe et dérivez-la de la classe System.Attribute comme indiqué ci-dessous.

using System;

public class CustomAttribute : Attribute

{

}

Pour contrôler l'utilisation des attributs personnalisés, vous pouvez tirer parti de la classe AttributeUsage. Cette classe contient des propriétés telles que ValidOn, AllowMultiple et Inherited qui peuvent être utilisées pour contrôler l'utilisation de votre attribut personnalisé.

L'extrait de code suivant illustre une version modifiée de notre classe d'attributs personnalisés. Notez l'utilisation d'un constructeur qui accepte une chaîne en tant qu'argument et l'affecte à la chaîne privée membre de la classe. Ceci est uniquement à des fins d'illustration.

[AttributeUsage(AttributeTargets.All)]

    public class CustomAttribute : Attribute

    {

        private string text;

        public CustomAttribute(string text)

        {

            this.Text = text;

        }

        public string Text

        {

            get

            {

                return this.text;

            }

            set

            {

                this.text = value;

            }

        }

    }

Vous pouvez également spécifier les cibles d'attribut auxquelles votre attribut personnalisé doit être appliqué. Voici comment vous pouvez le faire.

[AttributeUsage(AttributeTargets.Class |

AttributeTargets.Constructor |

AttributeTargets.Field |

AttributeTargets.Method |

AttributeTargets.Property,

AllowMultiple = true)]

    public class CustomAttribute : Attribute

    {

        private string text;

        public CustomAttribute(string text)

        {

            this.Text = text;

        }

        public string Text

        {

            get

            {

                return this.text;

            }

            set

            {

                this.text = value;

            }

        }

    }

Vous pouvez désormais utiliser la réflexion pour afficher tous les attributs appliqués à un objet particulier à l'aide de l'extrait de code suivant.

MemberInfo memberInfo = typeof(CustomAttribute);

object[] attributes = memberInfo.GetCustomAttributes(true);

for (int i = 0, j = attributes.Length; i < j; i++)

  {

     Console.WriteLine(attributes[i]);

  }

Considérons maintenant la classe suivante sur laquelle nous appliquerions notre attribut personnalisé.

[CustomAttribute("Hello World...")]

public class SomeClass

{

}

Notez comment l'attribut personnalisé a été utilisé et un texte lui a été transmis comme argument. L'extrait de code suivant illustre comment vous pouvez imprimer le contenu de la propriété Text.

MemberInfo memberInfo = typeof(SomeClass);

object[] attributes = memberInfo.GetCustomAttributes(true);

foreach (object attribute in attributes)

{

CustomAttribute customAttribute = attribute as CustomAttribute;

if (customAttribute != null)

Console.WriteLine("Text = {0}", customAttribute.Text);

else

Console.WriteLine();

}