[英]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.