【问题标题】:Fxcop custom rule to check name of derived class ends with base class nameFxcop 自定义规则检查派生类的名称以基类名称结尾
【发布时间】:2014-06-20 15:45:25
【问题描述】:

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

我主要关心Fxcop.Sdk 中是否有任何属性可以知道该特定类是否派生自任何基类?如果是,那么如何?

我该如何实施这条规则?

【问题讨论】:

    标签: c# code-analysis fxcop


    【解决方案1】:

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

    您在此处看到的是来自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;
    }
    

    【讨论】:

    • VS studio 在 NodeType.Object 的第三条条件语句中显示 Fxcop.Sdk 不包含 Object 的定义的错误。
    • 我实际上是把它写下来了,我会编辑我的答案。
    【解决方案2】:

    对于这种需求,您可以使用工具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 VisualStudioin a report

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-27
      • 2019-11-13
      • 2011-05-27
      • 1970-01-01
      • 2021-11-10
      • 2010-11-25
      相关资源
      最近更新 更多