C# 获取Roslyn中的案例标签常量
我试图从Roslyn的C# 获取Roslyn中的案例标签常量,c#,switch-statement,roslyn,C#,Switch Statement,Roslyn,我试图从Roslyn的SwitchStatement中收集开关部分标签常量。但是,尽管我可以在语法可视化工具中看到CaseSwitchLabelSyntax有一个Value属性和相应的常量,并且声明的符号(SourceLabelSymbol)有一个switchCaselLabelConstant属性,但我似乎无法从代码中获得这些信息 // SwitchStatementSyntax node; // SemanticModel model; foreach (var section in no
SwitchStatement
中收集开关部分标签常量。但是,尽管我可以在语法可视化工具中看到CaseSwitchLabelSyntax
有一个Value
属性和相应的常量,并且声明的符号(SourceLabelSymbol
)有一个switchCaselLabelConstant
属性,但我似乎无法从代码中获得这些信息
// SwitchStatementSyntax node;
// SemanticModel model;
foreach (var section in node.Sections) {
foreach (var label in section.Labels) {
var labelSymbol = model.GetDeclaredSymbol(label);
// Here I'm stuck
}
}
我可能可以查看SwitchLabelSyntax
是CaseSwitchLabelSyntax
还是DefaultSwitchLabelSyntax
并相应地强制转换SourceLabelSymbol
实际上是内部的,所以我无法访问它的属性model.GetConstantValue(label)
返回null
但考虑到Roslyn总是分发接口,我相信这是有原因的,疯狂地四处转悠让我觉得有点不舒服。有更好的选择吗
注意:我这样做是为了将C#语法翻译成另一种语言。从技术上讲,首先转换为单独的AST,然后再转换为文本。上面的代码来自CSharpSyntaxWalker
中,我可能只需要将部分转换的switch
语句存储起来,继续访问它的子代并分段构建它
但这意味着有更多的状态,在六个不同的位置构建语句,从而导致难以阅读和遵循的代码。如果可能的话,我宁愿在这里避免使用它。离API最近的是
semanticModel.GetConstantValue
方法,但仍然需要像这样向它传递值节点:
section.Labels
.OfType<CaseSwitchLabelSyntax>()
.Select(l => semanticModel.GetConstantValue(l.Value))
.ToArray()
section.Labels
第()类
.Select(l=>semanticModel.GetConstantValue(l.Value))
.ToArray()
正如您所看到的,过滤掉CaseSwitchLabelSyntax
仍然是必需的