gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:00:49 28 4
gpt4 key购买 nike

我正在尝试为 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 属性,但是当我尝试编码时与此相反,我似乎无法访问它。

ContainingNamespace

获取类命名空间最简单的方法是什么?即我想要 Assertin 的类的 namespace ,而不是 assert 的 namespace 。

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

最佳答案

ContainingSymbol 返回基础 ISymbol 接口(interface),它可以表示任何 符号。

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

关于c# - 从 Roslyn Analyzer 中的 InvocationExpressionSyntax 获取命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39642632/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com