我试图从Roslyn的SwitchStatement
收集切换部分标签常量。但是我可以在语法展示器中看到CaseSwitchLabelSyntax
具有Value
属性和相应的常量而声明的符号(SourceLabelSymbol
)具有SwitchCaseLabelConstant
属性,我不能似乎从我的代码中获得了那些信息。
// 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
语句存储起来,继续访问它的后代并将其逐段构建。
但这意味着拥有更多的状态,在六个不同的位置构建语句,这导致难以阅读和关注代码。如果可能的话,我宁愿在这里避免它。
答案 0 :(得分:3)
最接近API的是semanticModel.GetConstantValue
方法,但仍然需要将Value节点传递给它:
section.Labels
.OfType<CaseSwitchLabelSyntax>()
.Select(l => semanticModel.GetConstantValue(l.Value))
.ToArray()
正如您所见,无论如何都需要过滤掉CaseSwitchLabelSyntax
。