代码之家  ›  专栏  ›  技术社区  ›  Stefano d'Antonio

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

  •  2
  • Stefano d'Antonio  · 技术社区  · 9 年前

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

    using Something = DateTime;
    

    随后,我向其成员表示:

    var date = Something.Now;
    

    当我用 罗斯林 ,我要一个 简单成员访问表达式 对于 某物 不知道这只是一个别名 日期时间 .

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

    1 回复  |  直到 9 年前
        1
  •  4
  •   SJP    9 年前

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

    对于下面的代码,我假设您有一个文档,或者可以获得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),然后可以使用语义模型来解析MemberAccess表达式的类型。

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