我正在尝试开发一个自定义fxcop
规则来检查以基类名称结尾的派生类的名称。
我主要担心的是Fxcop.Sdk
中是否有任何属性知道该特定类是否来自任何基类?如果是,那么如何?
如何实施此规则?
答案 0 :(得分:2)
是的,是的,你可以。看一下下图:
您在此处看到的是introspector的屏幕截图,该工具可帮助您制定FxCop规则。
正如您所看到的,每个班级都有一个属性BaseType
和BaseClass
。您可以使用它们来检查类是否继承任何内容。
请注意,在Introspection模型中,例如,未从任何内容派生的类显示为派生自Object
。
您可以跳过这些(以及任何其他可能的错误):
public override ProblemCollection Check(TypeNode type)
{
ClassNode classNode = type as ClassNode;
if (classNode == null)
return;
if (classNode.BaseType == null)
return;
if (classNode.BaseType == FrameworkTypes.Object)
return;
// Namechecking logic
return Problems;
}
答案 1 :(得分:0)
对于这种需求,您可以使用工具NDepend,它可以通过C#LINQ查询为.NET代码编写自定义代码规则。 免责声明:我是此工具的开发人员之一
例如,要将自定义规则写入检查派生类的名称以基类名称结束,它就像:
// <Name>Derived class name must ends with base class name</Name>
warnif count > 0
from t in Application.Types
where t.IsClass
let baseClass = t.BaseClass
where !baseClass.IsThirdParty // Skip all .NET Fx base classes, like System.Object
where !t.SimpleName.EndsWith(baseClass.SimpleName)
select new {t, baseClass }
此类规则可以在Visual Studio中进行实时编辑,并在每次击键后立即编译/执行。
默认情况下会提供200 of such LINQ query rules左右。在CI过程中创建的规则违规can be seen live in VisualStudio或in a report。