C# 转换为嵌套类格式

C# 转换为嵌套类格式,c#,roslyn,C#,Roslyn,考虑到这样的情况: namespace Mystuff { public class Foo { public class Bar { } } } var barSymbol = compilation.GetTypeByMetadataName("MyStuff.Foo+Bar"); 在Rosyln中,如果我想得到表示条形码的符号,我可以这样做: namespace Mystuff { public class

考虑到这样的情况:

namespace Mystuff
{
    public class Foo
    {
        public class Bar
        {
        }
    }
}
var barSymbol = compilation.GetTypeByMetadataName("MyStuff.Foo+Bar");
在Rosyln中,如果我想得到表示
条形码的符号,我可以这样做:

namespace Mystuff
{
    public class Foo
    {
        public class Bar
        {
        }
    }
}
var barSymbol = compilation.GetTypeByMetadataName("MyStuff.Foo+Bar");
但这是行不通的:

var barSymbol = compilation.GetTypeByMetadataName("MyStuff.Foo.Bar");

您必须使用
+
来表示
Bar
嵌套在
Foo
中。但是如果我只有字符串
MyStuff.Foo.Bar
(因为它来自其他地方,它的名字是
Bar
),如果您事先不知道
MyStuff.Foo.Bar
Foo
中的嵌套类还是命名空间
MyStuff.Foo
中的非嵌套类,那么从
MyStuff.Foo.Bar
MyStuff.Foo+Bar
是否有可靠的方法


上拆分名称,然后从
compilation.SourceModule.GlobalNamespace
开始,循环遍历每个部分,并在当前符号上调用
GetMembers(name)
,以获得具有该名称的
itypeornamespace符号。

可能重复的@MethodMan:不是重复的。这是一个rosyln问题,问题是如何从点表示法转换为
GetTypeByMetadataName
所需的
+
表示法。您基本上希望将该名称解析为C#typename(但忽略命名空间导入),而不是CLR(元数据)名称。我不知道语义模型是否有用于此的API。Hmmm…。但是如果名称空间中有一个点,这会起作用吗?因此,如果名称空间是
MyStuff.Foo
,那么我在尝试
GetMembers(“MyStuff”)
时可能找不到任何内容?还是我弄错了?@MattBurland:不;这是一个嵌套的名称空间,可以很好地工作。是的,只是随便玩一下,它确实出现了(尽管我真的从来没有想过),如果你做一些类似
namespace foo.bar
,它确实会创建一个名称空间
foo
,其中包含一个名称空间
bar
。所以这应该行得通。谢谢