C# 在Roslyn中获取完全限定的元数据名称
我需要获取特定符号的完整CLR名称。这意味着对于泛型类型,我需要将C# 在Roslyn中获取完全限定的元数据名称,c#,roslyn,C#,Roslyn,我需要获取特定符号的完整CLR名称。这意味着对于泛型类型,我需要将`1、`2等附加到类型中。现在,ISymbol已经有了一个属性MetadataName,该属性正是这样做的。但它排除了周围的类型和名称空间,只给出了手边符号的名称 获取完全限定名称的常用选项,即通过ToDisplayString在这里不起作用,因为它不会对其各个部分使用MetadataName 有这种内置的吗?或者我必须将包含符号的链与中间的连接起来吗?(这一假设是否有突破点?) 编辑:刚刚注意到,如果某个类型包含在另一个类型中,
`1
、`2
等附加到类型中。现在,ISymbol
已经有了一个属性MetadataName
,该属性正是这样做的。但它排除了周围的类型和名称空间,只给出了手边符号的名称
获取完全限定名称的常用选项,即通过ToDisplayString
在这里不起作用,因为它不会对其各个部分使用MetadataName
有这种内置的吗?或者我必须将包含符号的链与中间的
连接起来吗?(这一假设是否有突破点?)
编辑:刚刚注意到,如果某个类型包含在另一个类型中,则在各个名称之间需要一个+
,但除此之外,我想使用
应该可以工作。目前,由于没有更好的解决方案,我正在使用以下方法:
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
的内部标志来启用这类功能(最明显的是,外部无法访问)
通过在StringBuilder
上使用Append
而不是Insert
,上述代码在最新的.NET版本上可能会更快,但这需要进行分析。请在CodePlex上支持我的Roslyn问题,以获取此功能:Roslyn团队成员为此创建了一个问题,请参阅