gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:10:03 28 4
gpt4 key购买 nike

我需要获取特定符号的完整 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 版本上可能会更快,但这是需要保留的东西用于分析。

关于c# - 在 Roslyn 中获取完全限定的元数据名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27105909/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com