2

我想使用 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 之类的东西可以,系统不行)

4

1 回答 1

2

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

如果在方法体中你写:

System.Console.WriteLine("x")

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

在其他语法位置,编译器知道得更好。例如,在本地声明中:

Syntax.Console x = null;

编译器知道它Syntax.Console指的是一个类型,所以它被解析为一个限定名,而不是一个成员访问表达式。

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

于 2012-08-16T18:55:12.950 回答