我正在尝试为Roslyn创建一个Analyzer,它将阻止在给定命名空间中使用Asserts(以确保维护项目设计标准)。
我已经能够确定这是否是一个断言,但我不确定如何从上下文中获取命名空间。
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
对象,但是当我尝试对此进行编码时,我似乎没有能够访问它。
获取类命名空间的最简单方法是什么?即我希望Assert
中的assert
是的名称空间,而不是NsShnb2enJcYEkfeE2fiSzbDc6O2
的名称空间。
作为奖励问题 - 有没有关于此的任何体面的文件?
答案 0 :(得分:2)
ContainingSymbol
返回基本ISymbol
界面,该界面可以代表任何符号。
要访问更具体的属性,您需要将其强制转换为更具体的界面,例如IMethodSymbol
。
答案 1 :(得分:1)
确保您已通过NuGet下载了最新的软件包。
但是,我不明白为什么你能够在运行时使用调试器看到它但无法对其进行编码。