Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 枚举程序集中的命名空间_C#_Roslyn - Fatal编程技术网

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

C# 枚举程序集中的命名空间,c#,roslyn,C#,Roslyn,我试图枚举程序集中声明的所有名称空间。 这样做感觉很不雅观: foreach (var syntaxTree in context.Compilation.SyntaxTrees) { foreach (var ns in syntaxTree.GetRoot(context.CancellationToken).DescendantNodes().OfType<NamespaceDeclarationSyntax>()) { ...

我试图枚举程序集中声明的所有名称空间。 这样做感觉很不雅观:

foreach (var syntaxTree in context.Compilation.SyntaxTrees)
{
    foreach (var ns in syntaxTree.GetRoot(context.CancellationToken).DescendantNodes().OfType<NamespaceDeclarationSyntax>())
    {
        ...         
    }
}
foreach(context.Compilation.SyntaxTrees中的var syntaxTree)
{
foreach(syntaxTree.GetRoot(context.CancellationToken.genderantnodes().OfType()中的变量ns)
{
...         
}
}
做这件事的好方法是什么?
树漫游者会更好一些,但之前会问,因为我感觉这已经出现在符号API的某个地方。

找到了使用
编译的方法,但感觉像是黑客

var namespaceSymbols = context
    .Compilation
    .GetSymbolsWithName(x => !string.IsNullOrEmpty(x), SymbolFilter.Namespace)
    .Cast<INamespaceSymbol>();
var namespacessymbols=上下文
汇编
.GetSymbolWithName(x=>!string.IsNullOrEmpty(x),SymbolFilter.Namespace)
.Cast();
调用将为您提供包含源中定义的所有命名空间的合并根命名空间。调用将为您提供根命名空间,该命名空间包含源代码或引用元数据中定义的所有命名空间和类型

从那里,您需要递归调用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);
}
IEnumerable GetAllNamespaces(InNamespaceSymbol namespaceSymbol)
{
foreach(namespaceSymbol.GetNamespaceMembers()中的InNamespaceSymbol符号)
{
收益返回符号;
foreach(GetAllNamespaces中的InNamespaceSymbol childSymbol(符号))
{
收益返回符号;
}
}
}
var allNamespaceNodes=新列表();
foreach(GetAllNamespaces(compilation.GlobalNamespace)中的InNamespaceSymbol namespaceSymbol)
{
allNamespaceNodes.AddRange(来自namespaceSymbol.DeclaringSyntaxReferences中的syntaxReference
选择syntaxReference.GetSyntax(cancellationToken)作为NamespaceDeclarationSyntax);
}

属于代码审查。不,这是关于roslyn API的问题。