【发布时间】:2014-06-20 15:45:25
【问题描述】:
我正在尝试开发一个自定义fxcop 规则来检查以基类名称结尾的派生类名称。
我主要关心Fxcop.Sdk 中是否有任何属性可以知道该特定类是否派生自任何基类?如果是,那么如何?
我该如何实施这条规则?
【问题讨论】:
标签: c# code-analysis fxcop
我正在尝试开发一个自定义fxcop 规则来检查以基类名称结尾的派生类名称。
我主要关心Fxcop.Sdk 中是否有任何属性可以知道该特定类是否派生自任何基类?如果是,那么如何?
我该如何实施这条规则?
【问题讨论】:
标签: c# code-analysis fxcop
是的,是的,你可以。请看下图:
您在此处看到的是来自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;
}
【讨论】:
对于这种需求,您可以使用工具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。
【讨论】: