2011-03-03 1 views
2

Y at-il un moyen de vérifier si mon élément avec la classe elementtype a une certaine autre classe dans sa hiérarchie d'héritage?Stylecop - La classe x est-elle dans ma hiérarchie d'héritage?

Mon utilisation est: Je dois vérifier si mes exceptions sont préfixées avec "Exception". Pour ce faire, je dois d'une manière ou d'une autre déterminer si une certaine classe est une exception. La seule façon dont je peux être sûr est si elle est héritée par la classe Exception elle-même.

Vérification du type de baseclass pour être une exception est assez facile, mais imaginez le scénario suivant:

class GenericMathException : Exception{} 
class SpecificMathException : GenericMathException{} 

La seule information que je peux obtenir sur le SpecificMathException est que c'est le type baseclass est GenericMathException, mais je peux » J'irai plus loin dans sa hiérarchie d'héritage.

L'approche habituelle de la réflexion ne peut pas être utilisée aussi, afaik.

Donc, quelqu'un a déjà eu à faire face à ce problème et a trouvé une solution? Ou a une autre approche pour identifier les exceptions?

Merci d'avance.

+0

Huh? Qu'est-ce que cela a à voir avec StyleCop? – SLaks

+0

Ce n'est vraiment un problème lors de la lecture du code via Stylecop, pas une question générale. C'est la "vue externe" qui rend ce problème. – Cyfer

+6

Je suppose qu'il veut créer une règle StyleCop. Mais je pense que cela fonctionnerait mieux comme une règle FxCop. Comme je le vois, StyleCop est pour l'application des règles sont le niveau du fichier source et FxCop au niveau de l'assemblage compilé. – CodesInChaos

Répondre

0

Par nature, StyleCop fonctionne en effet uniquement avec le contenu du fichier et ne peut pas utiliser les informations de l'assemblage lui-même. Mais, si vous demandez à propos de "l'approche alternative pour identifier les exceptions", il existe une règle dans StyleCop+ qui effectue une vérification très proche de la vôtre. Vous spécifiez une liste de classes de base (Attribute, Exception, EventArgs et Stream par défaut), et cela garantit que toutes les classes héritées ont le nom qui se termine par ...Attribute, ...Exception et ainsi de suite.

La vérification fonctionne de la manière suivante. Si le nom de la classe de base se termine par une chaîne de la liste, il s'assure que le nom de la classe héritée se termine également par la même chaîne. Par exemple, si elle répond Class2 : InvalidOperationException ou Class2 : SomeUnknownException, il va générer une violation dans les deux cas.

En supposant que vous suiviez cette règle, toutes vos classes héritées seront toujours nommées correctement, même si elles sont multi-héritées. La seule chose qui ne peut pas être vérifiée de cette façon, c'est la situation où vous faites face à certaines classes qui ne sont pas de votre assemblée, qui ont déjà enfreint cette règle. Par exemple, si un assembly a Class2 : Exception, et que vous référencez cet assembly comme un binaire (et que vous n'avez aucune chance de le vérifier avec StyleCop), vous ne pourrez pas vérifier si votre Class3 hérité de Class2 doit être préfixé par ...Exception. Mais la pratique montre que le dernier numéro est plutôt rare, donc la méthode décrite ci-dessus fonctionne très bien avec StyleCop.

+0

Merci beaucoup, mis en œuvre de cette façon. Seul ce qui reste est, si vous avez Class1: Exception et Class2: Class1, vous verrez seulement l'avertissement appartenant à Class1, et une fois que vous avez corrigé cela, l'avertissement appartenant à Class2 dans la deuxième exécution. Mais de toute façon, ce scénario est assez rare pour être acceptable. – Cyfer

Questions connexes