gpt4 book ai didi

c# - 使用 roslyn 获取所有类型

转载 作者:太空宇宙 更新时间:2023-11-03 11:18:06 24 4
gpt4 key购买 nike

我想使用 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 语句。你能告诉我这段代码有什么问题吗?

简而言之:我只想要不包括 namespace 的类型。这可能吗? (像 System.Console 这样的东西可以,系统不行)

最佳答案

我想你可能有点困惑。此代码根本不会向您显示类型。它将向您显示源代码中使用的标识符名称,以及任何成员访问表达式 (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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com