151 votes

Les attributs peuvent-ils être ajoutés dynamiquement en C #?

Est-il possible d'ajouter des attributs à l'exécution ou de modifier la valeur d'un attribut lors de l'exécution?

71voto

Alex Lyman Points 7480

Cela dépend vraiment de ce que vous essayez d'accomplir.

Le Système De.ComponentModel.TypeDescriptor des choses peut être utilisé pour ajouter des attributs de types, propriétés et des instances de l'objet, et a la limite que vous avez à l'utiliser pour récupérer ces propriétés. Si vous écrivez le code qui utilise ces attributs, et vous pouvez vivre à l'intérieur de ces limites, alors je serais certainement le suggérer.

Autant que je sache, la grille des propriétés de contrôle et de la conception de visual studio surface sont les seules choses dans la BCL qui consomment le TypeDescriptor choses. En fait, c'est comment ils font environ la moitié des choses qu'ils ont vraiment besoin de le faire.

69voto

Mark Cidade Points 53945

Les attributs sont des métadonnées statiques. Les assemblys, modules, types, membres, paramètres et valeurs de retour ne sont pas des objets de première classe dans C # (par exemple, la classe System.Type est simplement une représentation réfléchie d'un type). Vous pouvez obtenir une instance d'un attribut pour un type et modifier les propriétés si elles sont accessibles en écriture, mais cela n'affecte pas l'attribut tel qu'il est appliqué au type.

12voto

petr k. Points 4890

Vous ne pouvez pas. Une solution de contournement peut être de générer une classe dérivée à l'exécution et d'ajouter l'attribut, bien que ce soit probablement un peu exagéré.

11voto

torial Points 9883

Eh bien, juste pour être différent, j'ai trouvé un article qui fait référence à l'aide de Reflection.Emit de le faire.

Voici le lien: http://www.codeproject.com/KB/cs/dotnetattributes.aspx , vous voudrez également examiner certains des commentaires au bas de l'article, car les approches possibles sont discutées.

4voto

Thomas Danecker Points 3127

Non ce n'est pas.

Les attributs sont des méta-données et stockés sous forme binaire dans l'assemblage compilé (c'est pourquoi vous ne pouvez utiliser que des types simples).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X