c# - 如何使用 Roslyn 独立分析从别名获取类型

标签 c# roslyn roslyn-code-analysis

如果我在源中使用类型别名:

using Something = DateTime;

然后我提到它的成员:

var date = Something.Now;

当我使用Roslyn分析语法树时,我将得到SomethingSimpleMemberAccessExpression,而不知道它只是的别名日期时间

有没有办法从语义上知道某物是别名?我不想解析整个文件并跟踪所有别名。

最佳答案

要获取成员的类型,您需要使用语义模型来解析它。

对于下面的代码,我假设您有一个 Document 或者可以通过其他方式获取 SyntaxTree 和 SemanticModel:

    public static async Task GetNameFromDocument(Document document)
    {
        var syntaxTree = await document.GetSyntaxTreeAsync();
        var semanticModel = await document.GetSemanticModelAsync();
        var root = syntaxTree.GetRoot();


        MemberAccessExpressionSyntax member = GetMemberAccessExpressionSyntax(root);
        if (member != null)
        {
            var firstChild = member.ChildNodes().ElementAt(0);
            var typeInfo = semanticModel.GetTypeInfo(firstChild).Type as INamedTypeSymbol;
            var typeName = typeInfo.Name;
        }
    }

    public static MemberAccessExpressionSyntax GetMemberAccessExpressionSyntax(SyntaxNode node)
    {
        return node.DescendantNodes().Where(curr => curr is MemberAccessExpressionSyntax)
            .ToList().FirstOrDefault() as MemberAccessExpressionSyntax;
    }

您使用 SyntaxTree 来查找您的表达式 - 无论您认为合适(因此您必须替换 GetMemberAccessExpressionSyntax) - 然后可以使用语义模型来解析 MemberAccessExpression 的类型。

MemberAccessExpressionSyntax 的第一个子级应始终是被访问的成员,以便您可以使用语义模型获取节点并获取其类型。提供的 Type 是实际类型而不是别名 - typeName 将对应于 DateTime

关于c# - 如何使用 Roslyn 独立分析从别名获取类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36031260/

相关文章:

c# - 部署到 Azure 网站后访问路径被拒绝(发生类型 'System.UnauthorizedAccessException' 的异常)

c# - 将 SelectedItems 绑定(bind)到 ObservableCollection 属性

c# - Roslyn SyntaxNodes 是否被重用?

c# - 自定义规则 - 禁用子类的构造函数实现

c# - 使用 wpf 在列表框中绑定(bind)字典的键和值

c# - 如何在不窃取焦点且不使用 P/Invoke 的情况下将消息(例如鼠标滚轮)转发到另一个控件?

c# - 用 Roslyn 为某个方法的调用者提供信息

c# - 如何计算 lambda 表达式和匿名方法的嵌套数量?

roslyn - C# 代码分析 ProtectedAndInternal 与 ProtectedOrInternal

c# - 现在有没有一种简单的方法可以将 C# 中的任何特定方法/属性列入黑名单?