繁体   English   中英

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

[英]How to get type from alias using Roslyn standalone analysis

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

using Something = DateTime;

然后我引用它的成员:

var date = Something.Now;

当我用Roslyn分析语法树时,我将为Something提供一个SimpleMemberAccessExpression ,而不知道它只是DateTime的别名。

有没有办法知道Something是一个别名的语义? 我不想解析整个文件并跟踪所有别名。

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

对于下面的代码,我假设您有一个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的第一个Child应始终是被访问的成员,因此您可以使用语义模型获取节点并获取其类型。 提供的Type是acutal类型而不是别名 - typeName将对应于DateTime

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM