我想使用 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 这样的东西可以,System 不行)
最佳答案
我想你可能有点困惑。这段代码根本不会向您显示类型。它将向您显示源中使用的标识符名称以及任何成员访问表达式 (a.b)。其中一些可能是类型名称,但很可能它们只是代码表达式。
如果在方法主体中您写入:
System.Console.WriteLine("x")
从语法上来说,编译器还不知道 System.Console
是一个类型名称。它将该对解析为成员访问表达式,与 Console.WriteLine
部分没有什么不同。
在其他语法位置,编译器知道得更好。例如,在本地声明中:
Syntax.Console x = null;
编译器知道 Syntax.Console
引用一种类型,因此它被解析为限定名称,而不是成员访问表达式。
如果您确实想知道代码使用什么类型,您应该使用语义模型来发现这些点名称对应的类型符号。
关于c# - 使用 roslyn 获取所有类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11989075/