我正在尝试为Roslyn创建一个分析器,以防止在给定名称空间内使用断言(以确保项目设计标准得到维护)。从Roslyn分析器的InvocationExpressionSyntax中获取名称空间
我已经能够证明这是否是断言,但我不确定如何从上下文获取名称空间。
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
的名字空间。
作为一个额外的问题 - 有任何这样的体面文件?
这是赢家。看起来很奇怪,你可以在运行时看到它,但需要更新的软件包才能看到它。 –
@ObsidianPhoenix:如果你在VS中运行,那么由于VS bindingRedirects的原因,你在运行时使用最新的包。 – SLaks
@SLaks谢谢。那么,如果我为最新版本编码并且有人试图在较旧版本的VS2015上使用该软件包,会发生什么?它可能会破坏吗? –