如何创建具有严格继承检查的自定义样式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 {}
如何创建一个具有严格类型检查的规则,而不会被不同命名空间中具有相同名称的类绊倒?
这是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