4

我正在尝试实现一个ICodeIssueProvider来检测一个类(或其基类型之一)是否具有某个属性。

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()的方法呢?

此外,是否有更好的方法来检查 a 是否typeSymbol来自特定类而不是.BaseType手动检查

(是的,从下面的示例中检查MethodDeclarationSyntax节点而不是ClassDeclarationSyntax节点的原因并不明显)

4

1 回答 1

1

tldr; 不,没有单一的方法调用来执行此操作(截至 2012 年 9 月 CTP Roslyn)。

您需要搜索的父类可能(并且通常是)与您所在的类完全分开的语法树。如果您的所有类都在一个namespace声明中(不寒而栗),那么您可以从该SyntaxNode根进行搜索。

很有可能,您的类是每个文件一个,因此尽管它们共享相同的命名空间,但它们不在同一个语法树根目录下。

Roslyn 引起了很多麻烦,因为语法树更类似于代码文件的布局,而不是代码所代表的类型。

可能有一种方法可以从其下存在的所有类中创建一个新的语法树(现有的语法树是不可变的),namsepace然后搜索该树。对我来说,这感觉比需要的复杂得多,尤其是当父母方法更易于维护时。

于 2014-01-30T16:43:07.887 回答