从Roslyn Analyzer

时间:2016-09-22 15:05:02

标签: c# visual-studio-2015 roslyn analyzer

我正在尝试为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对象,但是当我尝试对此进行编码时,我似乎没有能够访问它。

ContainingNamespace

获取类命名空间的最简单方法是什么?即我希望Assert 中的assert的名称空间,而不是NsShnb2enJcYEkfeE2fiSzbDc6O2的名称空间。

作为奖励问题 - 有没有关于此的任何体面的文件?

2 个答案:

答案 0 :(得分:2)

ContainingSymbol返回基本ISymbol界面,该界面可以代表任何符号。

要访问更具体的属性,您需要将其强制转换为更具体的界面,例如IMethodSymbol

答案 1 :(得分:1)

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

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