在Roslyn中获取完全限定的元数据名称

Joe*_*oey 14 c# roslyn

我需要获取特定符号的完整CLR名称.这意味着,对于泛型类型,我需要的`1,`2等附加类型.现在,ISymbol已经有了一个MetadataName确实如此的财产.但是它排除了周围的类型和名称空间,只给出了手头符号的名称.

获得完全限定名称的通常选项,即通过ToDisplayString这里不太合适,因为它不会使用MetadataName它的各个部分.

有这样的内置吗?或者我是否必须在两者之间连接ContainingSymbols 链.?(这个假设是否存在分解?)

编辑:只是注意到你需要+在个别名称之间,如果它是包含在另一种类型中的类型,但除此之外,使用.应该工作,我想.

Joe*_*oey 12

目前,没有更好的解决方案,我使用以下内容:

public static string GetFullMetadataName(this ISymbol s) 
{
    if (s == null || IsRootNamespace(s))
    {
        return string.Empty;
    }

    var sb = new StringBuilder(s.MetadataName);
    var last = s;

    s = s.ContainingSymbol;

    while (!IsRootNamespace(s))
    {
        if (s is ITypeSymbol && last is ITypeSymbol)
        {
            sb.Insert(0, '+');
        }
        else
        {
            sb.Insert(0, '.');
        }

        sb.Insert(0, s.OriginalDefinition.ToDisplayString(SymbolDisplayFormat.MinimallyQualifiedFormat));
        //sb.Insert(0, s.MetadataName);
        s = s.ContainingSymbol;
    }

    return sb.ToString();
}

private static bool IsRootNamespace(ISymbol symbol) 
{
    INamespaceSymbol s = null;
    return ((s = symbol as INamespaceSymbol) != null) && s.IsGlobalNamespace;
}
Run Code Online (Sandbox Code Playgroud)

这似乎现在有效.Roslyn似乎有内部标志,SymbolDisplayFormat以启用那种东西(最值得注意的是SymbolDisplayCompilerInternalOptions.UseArityForGenericTypes,但外部无法访问.

上面的代码可能在最近的.NET版本上使用Append而不是Insert在上面更快StringBuilder,但这是留下用于分析的东西.