4

ICodeIssueProviderクラス(またはその基本型の1つ)に特定の属性があるかどうかを検出するために実装しようとしています。

public IEnumerable<CodeIssue> GetIssues(IDocument document,
        CommonSyntaxNode node,
        CancellationToken cancellationToken)
    {
        var methodDeclaration = (MethodDeclarationSyntax)node;
        var semanticModel = document.GetSemanticModel(cancellationToken);

        var methodSymbol = semanticModel.GetDeclaredSymbol(methodDeclaration);
        var typeSymbol = methodSymbol.ContainingType;

        // The following only gets attributes declared on this class, how to
        // also include those declared on a base class ?
        var attributes = typeSymbol.GetAttributes();

ずっと歩いてtypeSymbol.BaseType途中System.Objectで電話するよりも良い方法はありGetAttributes()ますか?

また、typeSymbol特定のクラスから派生しているかどうかを確認するよりも.BaseType、手動で確認するよりも良い方法はありますか

MethodDeclarationSyntax(そして、ノードではなくノードをチェックするための以下のサンプルから明らかではない理由がありますClassDeclarationSyntax)

4

1 に答える 1

1

tldr; いいえ、これを行う単一のメソッド呼び出しはありません (2012 年 9 月現在、CTP Roslyn)。

検索する必要がある親クラスは、現在のクラスとは完全に別の構文ツリーである可能性があります (通常はそうです)。すべてのクラスが単一の宣言内にある場合(身震い)、そのルートnamespaceから検索できます。SyntaxNode

おそらく、クラスはファイルごとに 1 つなので、同じ名前空間を共有していますが、同じ構文ツリー ルートの下にはありません。

Roslyn は頭を悩ませます。なぜなら、構文ツリーは、コードが表す型ではなく、コード ファイルのレイアウトに似ているからです。

その下に存在するすべてのクラスから新しい構文ツリー (既存の構文ツリーは不変) を作成し、namsepaceそのツリーを検索する方法があるかもしれません。私には、それは必要以上に複雑なように感じます。特に、親を育てる方法ははるかに保守しやすいためです。

于 2014-01-30T16:43:07.887 に答える