c# – 枚举程序集中的命名空间

我正在尝试枚举程序集中声明的所有名称空间.
做这样的事情感觉非常不优雅:

foreach (var syntaxTree in context.Compilation.SyntaxTrees)
{
    foreach (var ns in syntaxTree.GetRoot(context.CancellationToken).DescendantNodes().OfType<NamespaceDeclarationSyntax>())
    {
        ...         
    }
}

这样做的好方法是什么?
一个树步行者会更好一点,但之前要求我感觉这已经在符号API的某个地方了.

最佳答案
调用compilation.Assembly.GlobalNamespace将为您提供合并的根命名空间,其中包含源中定义的所有命名空间.调用compilation.GlobalNamespace将为您提供根命名空间,该命名空间包含源代码或引用的元数据中定义的所有名称空间和类型.

从那里你需要递归调用GetNamespaceMembers来获取所有命名空间符号:

IEnumerable<INamespaceSymbol> GetAllNamespaces(INamespaceSymbol namespaceSymbol)
{
    foreach (INamespaceSymbol symbol in namespaceSymbol.GetNamespaceMembers())
    {
        yield return symbol;
        foreach (INamespaceSymbol childSymbol in GetAllNamespaces(symbol))
        {
            yield return symbol;
        }
    }
}

var allNamespaceNodes = new List<NamespaceDeclarationSyntax>();
foreach (INamespaceSymbol namespaceSymbol in GetAllNamespaces(compilation.GlobalNamespace))
{
    allNamespaceNodes.AddRange(from syntaxReference in namespaceSymbol.DeclaringSyntaxReferences
                                select syntaxReference.GetSyntax(cancellationToken) as NamespaceDeclarationSyntax);
}

转载注明原文:c# – 枚举程序集中的命名空间 - 代码日志