查找基本类型的属性

时间:2013-05-22 20:07:14

标签: c# roslyn

我正在尝试实现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()更好的方法?

此外,是否有更好的方法来检查typeSymbol是否来自特定的课程而不是走路.BaseType并手动检查

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

1 个答案:

答案 0 :(得分:1)

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

您需要搜索的父类可能(并且通常是)与您所在的类完全独立的语法树。如果您的所有类都在单个namespace声明(颤抖)中,那么您可以搜索从那个SyntaxNode根。

很可能,你的类是每个文件一个,所以虽然它们共享相同的命名空间,但它们不在同一个语法树根目录下。

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

可能有一种方法可以在namsepace下存在的所有类中创建新的语法树(现有的语法树是不可变的),然后搜索该树。对我而言,这种感觉比所需要的更复杂,特别是作为一种助产父母的方法更易于维护。