如何使用严格的继承检查创建自定义样式警察规则?

时间:2013-02-06 17:31:33

标签: c# stylecop

我想创建一个Style Cop规则,如果直接类继承自System.Web.UI.Page,则会返回错误。我能够得到一个StyleCop.CSharp.Class的实例代表我正在看的任何课程,但从那里我有点不知所措。 Class对象(StyleCop,而不是System)有一个Declaration属性,它允许我获取声明中的所有内容......其中包括继承的类名。但这并不一定能保证唯一性。

检测这个很容易:

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

但是像这样的情况变得讨厌......

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

特别是当您拥有其他类以及此类声明时

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

如何创建一个具有严格类型检查的规则,该规则不会被不同命名空间中具有相同名称的类绊倒?

1 个答案:

答案 0 :(得分:2)

这是FxCop的工作,而不是Stylecop,因为您对已编译的代码感兴趣,而不是代码。

你只需要做一些反思(实际上,内省)来获取从System.Web.UI.Page继承的类型列表,然后检查他们的BaseTypeSystem.Web.UI.Page

以下是反思的基本示例:

    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