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
。所以这应该行得通。谢谢