Comment les attributs fonctionnent-ils en C #?
En C #, les attributs sont des balises de métadonnées affectées au code, y compris les classes, les types, les méthodes et les champs. En utilisant la réflexion, vous pouvez examiner les balises pour modifier les comportements dans votre programme. Nous montrerons comment les utiliser et comment rédiger les vôtres.
Quels sont les attributs?
En termes simples, les attributs sont des balises de métadonnées qui contiennent des informations. La syntaxe pour eux est le nom du type entre crochets au-dessus du code en cours de balisage, comme ceci:
(Attribute) void Command() {
Ils peuvent être attachés à pratiquement n'importe quoi – classes, méthodes, champs, structures, types, etc. Ils peuvent même recevoir des paramètres pour fournir des entrées accessibles, bien qu'ils soient limités aux types de base. Vous pouvez définir des paramètres en appelant l'attribut comme une méthode:
(Attribute("name", Test=false, Number=42))
Un cas d'utilisation courant est le marquage des champs pour la sérialisation. C # a un intégré (Serializable)
tag, qui prend en charge la sérialisation d'une classe en octets, et de nombreuses bibliothèques tierces implémenteront leurs propres balises. Par exemple, le pilote C # pour MongoDB comprend de nombreuses balises pour la sérialisation vers Bson, ainsi qu'une balise spéciale qui interprétera une chaîne comme l'ID de document.
Un autre cas d'utilisation courant est celui des méthodes de balisage gérées par un gestionnaire de commandes de niveau supérieur. Par exemple, un Discord Bot enregistre une liste de commandes qui sont gérées chaque fois que quelqu'un envoie un message. Plutôt que d'ajouter manuellement chaque commande au gestionnaire de commandes à chaque fois que vous en écrivez une nouvelle, vous pouvez à la place marquer la méthode avec (Command("commandname"))
, et utilisez la solution générique qui les ajoutera automatiquement lors de l'exécution.
Vous pouvez lire la documentation de Microsoft pour en savoir plus, mais elle est assez simple.
Comment créer vos propres attributs
Bien sûr, vous pouvez facilement créer vos propres attributs personnalisés à appliquer à vos classes. Tout ce que vous avez à faire est de créer une classe qui s'étend de System.Attribute
. Vous pouvez également ajouter un attribut sur cette classe spécifiant comment il doit être utilisé; par exemple, ne s'appliquant qu'aux classes ou aux structures.
Ensuite, vous pouvez spécifier des champs et un constructeur qui prendra les paramètres d'entrée et remplira les champs. Lorsque vous utilisez cet attribut, c'est comme appeler new Attribute(params)
, sauf sans le new
mot-clé.
(System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Struct))
public class AuthorAttribute : System.Attribute
{
private string name;
public double version;
public AuthorAttribute(string name)
{
this.name = name;
version = 1.0;
}
}
Vous êtes alors libre de les utiliser pour baliser votre code, à condition que l’attribut soit référencé dans le code en cours de balisage.
Pour accéder aux attributs par programmation, vous devez utiliser la réflexion. La réflexion n'est pas excellente pour les performances, mais pour les cas d'utilisation des attributs, cela n'a généralement pas d'importance. Vous pouvez utiliser Attribute.GetCustomAttributes
retourner un Attribute()
, en passant le type de la classe:
System.Attribute.GetCustomAttributes(typeof(className));
Si vous souhaitez accéder à toutes les instances d'attributs de votre assemblage, vous pouvez utiliser Assembly.GetExecutingAssembly().GetTypes()
pour récupérer une liste des types en cours d'exécution, puis vérifier tous les attributs personnalisés de ce type pour voir s'il contient le paramètre de recherche, en filtrant éventuellement cette liste en fonction du type de classe auquel l'attribut est attaché.
var plugins = Assembly.GetExecutingAssembly().GetTypes() .Where(t => t.IsClass && t.BaseType == typeof(BasePlugin) && Attribute.GetCustomAttributes(t).Any((atr) => atr.GetType() == typeof(MyCustomAttribute))) .ToList();
Pour accéder aux paramètres d'attribut, il vous suffit d'y accéder directement depuis la classe Attribute, comme toute autre propriété publique.