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

标签 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 这样的东西可以,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/

相关文章:

c# - 使用c#测试smtp邮件服务器的可用性

c# - CSC : error CS7038: Failed to emit module

c# - Mono Cecil 和 NRefactory 之间有什么关系,如何将它们与 Roslyn 进行比较?

c# - 更新依赖属性/附加属性中的普通属性,

c# - 自动缩放和刻度区间图表

c# - 如何在解决方案中集成测试控制台应用程序?

c# - 为什么 C# 中不允许通用属性?

C# MS-Access SQL INSERT INTO 错误

c# - 使用 Roslyn CTP 进行智能重构

c# - 如何解析 C# 类的方法体内的所有公共(public)方法名称和方法调用?