Question

OK, ce genre de suite fait suite à ma question précédente.

Ce que j'aimerais vraiment faire, c'est créer une sorte d'attribut qui me permette de décorer une méthode qui casser la construction.Tout comme le Obsolète("raison", vrai) attribut, mais sans identifier faussement le code obsolète.

Clarifier:Je ne veux pas que cela interrompe la construction N'IMPORTE LEQUEL Appuyez sur F6 (Build), je veux seulement qu'il interrompe la construction si une méthode décorée avec l'attribut est appelée ailleurs dans le code.Comme je l'ai dit, similaire obsolète, mais pas pareil.

Je sais que je ne suis pas seul dans ce cas, puisque d'autres utilisateurs souhaitent l'utiliser pour d'autres raisons.Je n’ai jamais créé d’attributs personnalisés auparavant, c’est donc tout nouveau pour moi !

Était-ce utile?

La solution

S'il s'agit de la sérialisation XML et de NHibernate, où vous souhaitez que le constructeur sans paramètre soit accessible (comme c'est le cas dans le exemple vous avez référencé), puis utilisez un constructeur sans paramètre privé ou protégé pour la sérialisation, ou un constructeur protégé pour NHibernate.Avec la version protégée, vous vous ouvrez à des classes héritées pouvant appeler ce code.

Si vous ne voulez pas que du code appelle une méthode, ne la rendez pas accessible.

MODIFIER:Pour peut-être répondre à la question plus profonde, AFAIK, le compilateur ne connaît que trois attributs : Obsolète, conditionnel et AttributeUsage.Ajouter une gestion spéciale pour d’autres attributs nécessiterait de modifier le compilateur.

Autres conseils

Je pense que ce serait une excellente demande de fonctionnalité pour Microsoft :Créer un attribut de classe de base abstraite CompilerExecutedAttribute que le compilateur traite d'une manière ou d'une autre ou qui peut influencer le processus de compilation.Ensuite, nous pourrions hériter de cet attribut et implémenter différentes opérations, par ex.émettre une erreur ou un avertissement.

Si vous considérez un avertissement (ce que [Obsolète] génère) qui brise la construction, utilisez simplement le #avertissement directive du compilateur.

Modifier:Je ne l'ai jamais utilisé, mais #erreur est également disponible.

Je pense que le seul moyen infaillible serait d'étendre Visual Studio (via VSIP) et de vous abonner à la classe d'événement correcte (peut-être dans la classe EnvDTE.BuildEvents), de vérifier votre code pour l'utilisation du constructeur et d'annuler la construction si vous le détecter.

Tout cela commence à ressembler un peu à Le TDWTF d'hier. :-)

Je devrai être d'accord avec Greg :créez un attribut pour cela.

Et si vous êtes vraiment sérieux, trouvez peut-être un moyen de déterminer si le constructeur est accédé par autre chose que XMLSerializer et lancez une exception si c'est le cas.

Je vous suggère d'utiliser la directive #error.

Un autre attribut assez inconnu qui pourrait faire le travail est le attribut conditionnel (en fonction de ce que vous essayez d'atteindre)

[Conditional("CONDITION")] 
public static void MiMethod(int a, string msg)

qui supprimera l'invocation de méthode du code IL lui-même si "MY_CONDITION" est défini.

Créez une règle FxCop et ajoutez FxCop à votre version d'intégration afin de vérifier cela.

Vous recevrez des avertissements, plutôt qu'une version défaillante.Les attributs « s'exécutent » au moment de la réflexion plutôt qu'au moment de la construction.

Alternativement (et c'est plutôt méchant), placez une directive du compilateur autour de la méthode que vous ne souhaitez pas appeler.Ensuite, votre code sera interrompu si vous l'appelez, mais vous pouvez configurer une version qui transmet la bonne directive du compilateur et ne le fait pas.

Lancez une exception personnalisée et un test unitaire pour celle-ci en tant qu'étape de post-construction

Je réponds 4 ans plus tard :)

J'avais la même question s'il existait une alternative à Obsolète.

D'après ce dont je me souviens (vidéos Channel9), il y a peu de temps, Microsoft a déclaré qu'il travaillait à donner aux développeurs l'accès à quelque chose comme une API de compilateur, donc à l'avenir, il est concevable que vous puissiez écrire un "plug-in" de compilateur qui permettrait de pour décorer les méthodes avec votre propre attribut personnalisé et dire au compilateur d'annuler s'il semble que le code décoré pourrait être appelé ailleurs dans le code, etc.

Ce qui serait en fait plutôt cool quand on y pense.Cela me rappelle également que je devrais également essayer de me renseigner sur les progrès de l'API du compilateur sur laquelle MS travaille...

Pourquoi ne pas simplement inventer quelque chose ?Un attribut inconnu interromprait sûrement la construction.

[MyMadeUpAttributeThatBreaksTheBuildForSure]
public class NotDoneYet {}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top