2013-02-06 1 views
2

Je voudrais créer une règle Style Cop qui renvoie une erreur si une classe directement hérite de System.Web.UI.Page. Je suis en mesure d'obtenir une instance de StyleCop.CSharp.Class représentant la classe que je regarde, mais à partir de là, je suis un peu perdu. L'objet Class (StyleCop, pas System) a un attribut Declaration qui me permettrait d'obtenir tout ce qui figure dans la déclaration ... qui inclut le nom de la classe héritée. Mais cela ne garantit pas nécessairement l'unicité.Comment puis-je créer une règle Style Cop personnalisée avec un contrôle d'héritage strict?

Détection de c'est assez facile:

public class Foobar : System.Web.UI.Page {} 

Mais une circonstance comme cela devient méchant ...

using Page = System.Web.UI.Page; 
public class Foobar : Page {} 

Surtout quand vous avez autres cours avec des déclarations comme celle-ci

using Page = Company.Some.Thing.Page; 
public class Foobar : Page {} 

Comment puis-je créer ar ule avec une vérification de type stricte qui ne soit pas déclenchée par des classes portant le même nom dans des espaces de noms différents?

Répondre

2

Il est un travail pour FxCop, pas StyleCop, que vous êtes intéressé par le code compilé , pas le code source .

Vous simplement devoir faire un peu de réflexion (bien, introspection fait) pour obtenir la liste des types héritant de System.Web.UI.Page, vérifiez si leur BaseType est System.Web.UI.Page ou non.

Voici un exemple de base de la réflexion:

internal class Test2 : Test 
    { 
    } 

    internal class Test : Program 
    { 
    } 

    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      foreach (var type in Assembly.GetExecutingAssembly().GetTypes()) 
      { 
       if (typeof(Program).IsAssignableFrom(type)) 
       { 
        if (type.BaseType == typeof(Program)) 
        { 
         Console.WriteLine("strict inheritance for {0}", type.Name); 
        } 
        else 
        { 
         Console.WriteLine("no strict inheritance for {0}", type.Name); 
        } 
       } 
      } 

      Console.Read(); 
     } 
    } 

no strict inheritance for Program 
strict inheritance for Test 
no strict inheritance for Test2 
Questions connexes