簡體   English   中英

在Roslyn中獲取完全限定的元數據名稱

[英]Get fully-qualified metadata name in Roslyn

我需要獲取特定符號的完整CLR名稱。 這意味着對於泛型類型,我需要在類型上附加`1`2等。 現在, ISymbol已經擁有了一個屬性MetadataName 但是它排除了周圍的類型和名稱空間,只給出了手頭符號的名稱。

獲取完全限定名稱的通常選項,即通過ToDisplayString在這里不太起作用,因為它不會將MetadataName用於其各個部分。

有這樣的內置嗎? 或者我必須將ContainingSymbol的鏈連接起來. 在...之間? (這個假設是否存在分解?)

編輯:只是注意到如果它是另一種類型中包含的類型,則需要在各個名稱之間加一個+ ,但除此之外,使用. 應該工作,我想。

目前,沒有更好的解決方案,我使用以下內容:

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;
}

這似乎現在有效。 Roslyn似乎有SymbolDisplayFormat內部標志,可以啟用那種東西(最值得注意的是SymbolDisplayCompilerInternalOptions.UseArityForGenericTypes ,但外部無法訪問)。

通過在StringBuilder上使用Append而不是Insert ,上面的代碼在最近的.NET版本上可能會更快,但這是留下用於分析的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM