检查派生类名称的Fxcop自定义规则以基类名称结束

时间:2014-06-19 06:41:35

标签: c# code-analysis fxcop

我正在尝试开发一个自定义fxcop规则来检查以基类名称结尾的派生类的名称。

我主要担心的是Fxcop.Sdk中是否有任何属性知道该特定类是否来自任何基类?如果是,那么如何?

如何实施此规则?

2 个答案:

答案 0 :(得分:2)

是的,是的,你可以。看一下下图:

enter image description here

您在此处看到的是introspector的屏幕截图,该工具可帮助您制定FxCop规则。

正如您所看到的,每个班级都有一个属性BaseTypeBaseClass。您可以使用它们来检查类是否继承任何内容。

请注意,在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中进行实时编辑,并在每次击键后立即编译/执行。

enter image description here

默认情况下会提供200 of such LINQ query rules左右。在CI过程中创建的规则违规can be seen live in VisualStudioin a report