Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.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#_Switch Statement_Roslyn - Fatal编程技术网

C# 获取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

我试图从Roslyn的
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
仍然是必需的