2009-08-19 7 views
4

J'écris du code de bibliothèque, et les classes qui utilisent ce code doivent avoir deux attributs spécifiés (un attribut personnalisé et un de .NET). C'est un peu compliqué de documenter cette exigence et de copier et coller ces deux attributs sur chaque classe qui utilise ma bibliothèque, donc j'ai pensé qu'il serait peut-être mieux d'avoir mon attribut personnalisé juste impliquer la présence de la autre. Cet autre attribut du framework .NET est cependant scellé, donc je ne peux pas en hériter ...Un attribut personnalisé peut-il impliquer d'autres attributs sans héritage?

Y a-t-il un moyen de le faire? Puis-je ajouter l'attribut .NET à l'exécution?

Merci.

+0

Pouvez-vous nous dire ce qu'est l'attribut .Net? –

+0

System.ServiceModel.XmlSerializerFormatAttribute –

Répondre

1

Alors que peut utiliser l'héritage dans les attributs, il est recommended you don't. Étant donné qu'il ne s'agit que d'une règle de performance, vous ne violez pas l'exactitude mais cela peut être une source de confusion et vous devez faire beaucoup d'efforts pour ne pas violer la sémantique de l'attribut de base. Vous pouvez provoquer des problèmes si vous tentez d'étendre les emplacements possibles pour l'attribut avec les indicateurs AttributeUsage. Les règles pour l'attribut en question sont quite complex.

Une méthode peut avoir l'un des deux attributs appliqués, mais pas les deux. Toute opération qui n'a appliqué ni l'un ni l'autre utilise l'attribut appliqué à la classe conteneur. Si la classe conteneur n'a aucun attribut appliqué, DataContractSerializer est utilisé.

Donnez-le en le rendant étanche comme un plan raisonnable de leur part. Cette API n'est pas conçue pour ce type d'extension.

Il est impossible d'ajouter des attributs aux classes existantes au moment de l'exécution (en deçà de l'injection de code de style AOP).

+0

Cela a du sens. Je vais juste garder le contrôle d'exécution pour faire respecter l'exigence. –

0

Je ne crois pas qu'il existe un moyen d'impliquer des attributs secondaires ou d'ajouter des attributs lors de l'exécution. Toutefois, vous pouvez utiliser un modèle de code personnalisé pour ajouter les attributs à chaque classe lorsque vous les ajoutez. Et/ou pour les classes qui sont déjà développées, je pense que vous pourriez écrire une macro qui traverse chaque fichier et ajoute les attributs aux classes, mais je ne l'ai pas fait par le passé, donc je ne suis pas sûr de ce que cela impliquerait Je sais que créer un modèle de code à ajouter aux attributs d'une déclaration de classe est relativement simple. Mais cela ne fonctionne que pour les classes que vous ajoutez à partir du moment de l'ajout du modèle. Si vous devez également nettoyer les anciennes classes, je rechercherais des macros si vous avez beaucoup de fichiers/classes pour lesquels cela doit être fait. Ou faites-le manuellement s'il n'y en a pas trop.

Questions connexes