使用roslyn获取所有类型

时间:2012-08-16 14:13:30

标签: c# roslyn

我想使用Roslyn来获取一段代码中使用的所有类型。我从以下SyntaxWalker开始:

public class DependenciesCollector : SyntaxWalker
{
    public override void VisitIdentifierName(IdentifierNameSyntax node)
    {
        if (!(node.Parent is UsingDirectiveSyntax))
        {
            Console.WriteLine(node.PlainName);
        }
        base.VisitIdentifierName(node);
    }

    public override void VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
    {
        Console.WriteLine(node.Expression + "." + node.Name);
        base.VisitMemberAccessExpression(node);
    }
}

但是我没有只显示使用的(部分)类型,而是显示using语句,而我(如你所见)试图不显示using语句。你能告诉我这段代码有什么问题吗?

简而言之:我只想要除名称空间之外的类型。这甚至可能吗? (像System.Console这样的东西没问题,系统没有)

1 个答案:

答案 0 :(得分:2)

我觉得你可能有点困惑。此代码根本不会显示您的类型。它将向您显示源中使用的标识符名称以及任何成员访问表达式(a.b)。其中一些可能是类型名称,但很可能它们只是代码表达式。

如果在方法正文中你写了:

System.Console.WriteLine("x")

从语法上讲,编译器还不知道System.Console是一个类型名称。它将该对解析为成员访问表达式,与Console.WriteLine部分没有区别。

在其他语法位置,编译器更清楚。例如,在本地声明中:

Syntax.Console x = null;

编译器知道Syntax.Console引用了一个类型,因此它被解析为限定名,而不是成员访问表达式。

如果您真的想知道代码使用的是哪种类型,您应该使用语义模型来发现这些虚线名称对应的类型符号。