2016-09-22 78 views
2

我正在尝试为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属性,但是当我尝试代码针对此,我似乎不能够访问它。

ContainingNamespace

请告诉我获取类的命名空间的最简单的方法?即我想要Assert这个类的名字空间在中,而不是assert的名字空间。

作为一个额外的问题 - 有任何这样的体面文件?

回答

1

确保您通过NuGet下拉了最新的软件包。

但是我不明白你为什么能够在运行时使用调试器看到它​​,但无法对它进行编码。

+0

这是赢家。看起来很奇怪,你可以在运行时看到它,但需要更新的软件包才能看到它。 –

+1

@ObsidianPhoenix:如果你在VS中运行,那么由于VS bindingRedirects的原因,你在运行时使用最新的包。 – SLaks

+0

@SLaks谢谢。那么,如果我为最新版本编码并且有人试图在较旧版本的VS2015上使用该软件包,会发生什么?它可能会破坏吗? –

2

ContainingSymbol返回基地ISymbol接口,它可以代表任意符号。

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

+0

所以问题的一部分是我甚至无法看到上下文中的containssymbol属性。我如何得到它? –

+1

这应该起作用。 http://source.roslyn.io/#Microsoft.CodeAnalysis/DiagnosticAnalyzer/DiagnosticAnalysisContext.cs,1110 – SLaks

相关问题