5

我正在使用 Roslyn 2012 年 9 月的 CTP。

在 ac# 代码文档中获取未解析类型的最优雅方法是什么?例如。类型 Guid 需要 System 命名空间。目前我有这样的事情:

            var semanticModel = (SemanticModel)document.GetSemanticModel();
            var tree = (SyntaxTree)document.GetSyntaxTree();

            //get unresolved types
            var unresolvedTypes = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>()
                .Where(x => semanticModel.GetSymbolInfo(x).Symbol == null);

使用 IdentifierNameSyntax 和 GetSymbolInfo 是否正确?

另外GetSymbolInfoGetTypeInfo之间有什么区别,它们看起来都与我非常相似。

4

1 回答 1

9

这里有几个问题。

问:使用正确IdentifierNameSyntax吗?
A:你可能想用它SimpleNameSyntax来处理解析泛型类型。此外,您可能不想查看所有SimpleNameSyntax元素。对于实际上不在类型上下文中的事物,您将得到误报(例如,想象一些代码,例如var x = Console();

GetSymbolInfoQ:使用和检查null是否正确?
A: 是的,在这里检查是正确的。

问:GetSymbolInfo和 和有什么不一样GetTypeInfo
答:对于表示类型名称的语法,没有区别。但是,对于任意表达式,GetSymbolInfo表示表达式的特定符号(例如,方法调用、索引器访问、数组访问、重载运算符等),并GetTypeInfo表示结果类型(以便您知道在添加时要生成什么类型表达式的声明)。以for InvocationExpressionSyntaxmyString.GetHashCode()”为例。 GetSymbolInfo将返回 的方法符号GetHashCode(),而GetTypeInfo将返回System.Int32

于 2012-12-12T16:33:19.830 回答