【问题标题】:How to get type from alias using Roslyn standalone analysis如何使用 Roslyn 独立分析从别名中获取类型
【发布时间】:2016-07-02 01:43:54
【问题描述】:

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

using Something = DateTime;

然后我提到它的成员:

var date = Something.Now;

当我使用 Roslyn 分析语法树时,我会为 Something 生成一个 SimpleMemberAccessExpression,但我并不知道它只是 的别名日期时间

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

【问题讨论】:

    标签: c# roslyn roslyn-code-analysis


    【解决方案1】:

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

    对于以下代码,我假设您有一个 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

    【讨论】:

    • 谢谢,它看起来正是我所追求的,我稍后会测试它;这会对我的独立分析仪的性能产生影响吗? (鉴于现在它还需要进行语义分析,而不仅仅是语法分析)。
    • 检索语义模型后,我从未遇到任何性能问题。它似乎总是运行得很快,但我从未明确测试过这种代码的速度。
    • SemanticModel 速度较慢,但​​如果您必须使用它们,请使用它们。这就是他们的目的!人们经常被我们的语法模型所吸引,并在此过程中编写错误。 :-)
    猜你喜欢
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多