我想使用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这样的东西没问题,系统没有)
答案 0 :(得分:2)
我觉得你可能有点困惑。此代码根本不会显示您的类型。它将向您显示源中使用的标识符名称以及任何成员访问表达式(a.b)。其中一些可能是类型名称,但很可能它们只是代码表达式。
如果在方法正文中你写了:
System.Console.WriteLine("x")
从语法上讲,编译器还不知道System.Console
是一个类型名称。它将该对解析为成员访问表达式,与Console.WriteLine
部分没有区别。
在其他语法位置,编译器更清楚。例如,在本地声明中:
Syntax.Console x = null;
编译器知道Syntax.Console
引用了一个类型,因此它被解析为限定名,而不是成员访问表达式。
如果您真的想知道代码使用的是哪种类型,您应该使用语义模型来发现这些虚线名称对应的类型符号。