Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Roslyn中获取完全限定的元数据名称_C#_Roslyn - Fatal编程技术网

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

C# 在Roslyn中获取完全限定的元数据名称,c#,roslyn,C#,Roslyn,我需要获取特定符号的完整CLR名称。这意味着对于泛型类型,我需要将`1、`2等附加到类型中。现在,ISymbol已经有了一个属性MetadataName,该属性正是这样做的。但它排除了周围的类型和名称空间,只给出了手边符号的名称 获取完全限定名称的常用选项,即通过ToDisplayString在这里不起作用,因为它不会对其各个部分使用MetadataName 有这种内置的吗?或者我必须将包含符号的链与中间的连接起来吗?(这一假设是否有突破点?) 编辑:刚刚注意到,如果某个类型包含在另一个类型中,

我需要获取特定符号的完整CLR名称。这意味着对于泛型类型,我需要将
`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团队成员为此创建了一个问题,请参阅