从 Roslyn Analyzer 中的 InvocationExpressionSyntax 获取命名空间

Get Namespace from InvocationExpressionSyntax in Roslyn Analyzer

我正在尝试为 Roslyn 创建一个分析器,它将阻止在给定命名空间内使用断言(以确保维护项目设计标准)。

我已经能够验证这是否是一个断言,但我不确定如何从上下文中获取命名空间。

public override void Initialize(AnalysisContext context)
{
    context.RegisterSyntaxNodeAction(AnalyzeMethod, SyntaxKind.InvocationExpression);
}

private static void AnalyzeMethod(SyntaxNodeAnalysisContext context)
{
    var expression = (InvocationExpressionSyntax)context.Node;

    var memberAccessExpression = expression.Expression as MemberAccessExpressionSyntax;

    if (memberAccessExpression == null) return;

    var memberSymbol = ModelExtensions.GetSymbolInfo(context.SemanticModel, memberAccessExpression).Symbol as IMethodSymbol;

    if (!memberSymbol?.ToString().Contains("Assert") ?? true) return;

    //Check if we're inside the Page Namespace.


    //This is an Assert, lets fail it.
    var diagnostic = Diagnostic.Create(Rule, memberAccessExpression.GetLocation(), memberAccessExpression.Name);

    context.ReportDiagnostic(diagnostic);
}

在检查 context 对象本身时,我可以看到一个 ContainingSymbol 对象,其中包含一个 ContainingNamespace 属性,但是当我尝试对此进行编码时,我似乎无法访问它。

获取 class 命名空间的最简单方法是什么?即我想要 class Assert 的命名空间是 in,而不是 assert.

的命名空间

作为一个额外的问题 - 是否有关于这些的任何合适的文档?

ContainingSymbol returns基础ISymbol接口,可以表示任何符号。

要访问更具体的属性,您需要将其转换为更具体的接口,例如 IMethodSymbol

确保您已通过 NuGet 下载最新的包。

但是我不明白为什么您可以使用调试器在运行时看到它但无法针对它进行编码。