如何创建具有严格继承检查的自定义样式Cop规则

本文关键字:检查 继承 自定义 样式 规则 Cop 何创建 创建 | 更新日期: 2023-09-27 17:58:07

我想创建一个样式Cop规则,如果类直接System.Web.UI.Page继承,该规则将返回错误。我可以得到一个StyleCop.CSharp.Class的实例来表示我正在查看的任何类,但从那里我有点不知所措。Class对象(StyleCop's,而不是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 {}

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

如何创建具有严格继承检查的自定义样式Cop规则

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

您只需进行一点反射(实际上是内省)即可获得从System.Web.UI.Page继承的类型列表,然后检查它们的BaseType是否为System.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