Bien que le code pour créer un attribut personnalisé soit assez simple, il est très important que vous compreniez ce que sont les attributs:
Les attributs sont des métadonnées compilées dans votre programme. Les attributs eux-mêmes n'ajoutent aucune fonctionnalité à une classe, une propriété ou un module - juste des données. Cependant, en utilisant la réflexion, on peut exploiter ces attributs afin de créer des fonctionnalités.
Alors, par exemple, regardons le bloc d'application de validation , de la bibliothèque d'entreprise de Microsoft . Si vous regardez un exemple de code, vous verrez:
/// <summary>
/// blah blah code.
/// </summary>
[DataMember]
[StringLengthValidator(8, RangeBoundaryType.Inclusive, 8, RangeBoundaryType.Inclusive, MessageTemplate = "\"{1}\" must always have \"{4}\" characters.")]
public string Code { get; set; }
À partir de l'extrait ci-dessus, on peut deviner que le code sera toujours validé, chaque fois qu'il sera modifié, conformément aux règles du validateur (dans l'exemple, avoir au moins 8 caractères et au plus 8 caractères). Mais la vérité est que l'attribut ne fait rien; comme mentionné précédemment, il ajoute uniquement des métadonnées à la propriété.
Cependant, la bibliothèque d'entreprise a un Validation.Validate
méthode qui examinera votre objet, et pour chaque propriété, elle vérifiera si le contenu enfreint la règle informée par l'attribut.
Donc, c'est ainsi que vous devriez penser aux attributs - un moyen d'ajouter des données à votre code qui pourraient être utilisées plus tard par d'autres méthodes / classes / etc.
Vous commencez par écrire une classe qui dérive de Attribute :
Ensuite, vous pouvez décorer n'importe quoi (classe, méthode, propriété, ...) avec cet attribut:
et enfin vous utiliseriez la réflexion pour le récupérer:
Vous pouvez limiter les types de cibles auxquels cet attribut personnalisé peut être appliqué à l'aide de l' attribut AttributeUsage :
Choses importantes à savoir sur les attributs:
la source
var value = typeof(Foo).GetCustomAttributes<MyCustomAttribute>().First().SomeProperty;
En utilisant / Copiant la grande réponse de Darin Dimitrov, voici comment accéder à un attribut personnalisé sur une propriété et non sur une classe:
La propriété décorée [de classe
Foo
]:Récupérer:
Vous pouvez lancer ceci dans une boucle et utiliser la réflexion pour accéder à cet attribut personnalisé sur chaque propriété de la classe
Foo
, ainsi:Grand merci à toi, Darin !!
la source
object[] attribute = propertyInfo.GetCustomAttributes(typeof(???), true);
Je veux juste les parcourir tous et appeler une méthodem1()
de chaque attribut inconnuLa réponse courte est pour créer un attribut en c #, il vous suffit de l'hériter de la classe Attribute, juste ceci :)
Mais ici, je vais expliquer les attributs en détail:
fondamentalement, les attributs sont des classes que nous pouvons les utiliser pour appliquer notre logique aux assemblys, classes, méthodes, propriétés, champs, ...
Dans .Net, Microsoft a fourni des attributs prédéfinis tels que des attributs obsolètes ou de validation tels que ([Obligatoire], [StringLength (100)], [Range (0, 999.99)]), ainsi que des types d'attributs comme ActionFilters dans asp.net qui peut être très utile pour appliquer notre logique souhaitée à nos codes (lisez cet article sur les filtres d'action si vous êtes passionné de l'apprendre)
un autre point, vous pouvez appliquer une sorte de configuration sur votre attribut via AttibuteUsage.
Lorsque vous décorez une classe d'attribut avec AttributeUsage, vous pouvez dire au compilateur c # où je vais utiliser cet attribut: je vais l'utiliser sur des classes, sur des assemblys sur des propriétés ou sur ... et mon attribut est autorisé à utiliser plusieurs fois sur des cibles définies (classes, assemblages, propriétés, ...) ou pas?!
Après cette définition des attributs, je vais vous montrer un exemple: imaginez que nous voulons définir une nouvelle leçon à l'université et que nous voulons permettre uniquement aux administrateurs et aux maîtres de notre université de définir une nouvelle leçon, d'accord?
Dans le monde réel de la programmation, nous n'utilisons peut-être pas cette approche pour utiliser les attributs et je l'ai dit en raison de son intérêt pédagogique dans l'utilisation des attributs
la source