传统的做法是在C#解决方案中命名命名空间,以便它们与项目的默认命名空间以及包含文件的任何子目录的名称匹配。
例如,一个名为Haddock.cs
的文件位于一个名为Fish
的目录中,默认名称空间(在项目属性的第一个选项卡中,在VS中)是Lakes
,那么该文件应该包含以下内容
namespace Lakes.Fish
{
public class Haddock
{
}
}
StyleCop analyzers项目包含一个很好的规则,它验证类名是否与文件名匹配。
我是否可以编写一条规则来验证名称空间名称是否正确?
发布于 2015-09-15 23:50:02
您可以使用离开SyntaxTreeAction
的Tree.FilePath
从SyntaxTreeContext
访问文件路径。
有了路径之后,就可以解析它,并将其与树中所有NamesSpaceDeclarationSyntax
节点的名称进行比较。
不幸的是,我认为目前还没有获得项目默认名称空间的方法。
这是一个快速的样本,我把它放在一起,做到目前为止所能做的。对命名空间路径的处理/比较是基本的,可能有更好的方法,但这应该会让您开始工作。
public override void Initialize(AnalysisContext context)
{
context.RegisterCompilationStartAction((compilationSyntax) =>
{
compilationSyntax.RegisterSyntaxTreeAction((syntaxTreeContext) =>
{
var semModel = compilationSyntax.Compilation.GetSemanticModel(syntaxTreeContext.Tree);
var filePath = syntaxTreeContext.Tree.FilePath;
if (filePath == null)
return;
var namespaceNodes = syntaxTreeContext.Tree.GetRoot().DescendantNodes().OfType<NamespaceDeclarationSyntax>();
var parentDirectory = System.IO.Path.GetDirectoryName(filePath);
// This will only work on windows and is not very robust.
var parentDirectoryWithDots = parentDirectory.Replace("\\", ".").ToLower();
foreach (var ns in namespaceNodes)
{
var symbolInfo = semModel.GetDeclaredSymbol(ns) as INamespaceSymbol;
var name = symbolInfo.ToDisplayString();
if (!parentDirectoryWithDots.EndsWith(name.ToLower().Trim()))
{
syntaxTreeContext.ReportDiagnostic(Diagnostic.Create(
Rule, ns.Name.GetLocation(), parentDirectoryWithDots));
}
}
});
});
}
https://stackoverflow.com/questions/32593116
复制相似问题