2

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

using Something = DateTime;

后来我提到了它的成员:

var date = Something.Now;

当我使用Roslyn分析语法树时,我将有一个SimpleMemberAccessExpression for Something,但不知道它只是DateTime的别名。

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

4

1 回答 1

4

要获得成员的类型,您需要使用语义模型对其进行解析。

对于以下代码,我假设您有一个 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 来查找您的 Expression - 但是您认为合适(因此您必须替换 GetMemberAccessExpressionSyntax) - 然后可以使用语义模型来解析 MemberAccessExpression 的类型。

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

于 2016-03-16T10:06:47.457 回答