gpt4 book ai didi

c# - 在 Roslyn 中获取 case 标签常量

转载 作者:行者123 更新时间:2023-11-30 16:09:38 24 4
gpt4 key购买 nike

我正在尝试使用 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
}
}

我可能会查看 SwitchLabelSyntaxCaseSwitchLabelSyntax 还是 DefaultSwitchLabelSyntax 并进行相应的转换。 SourceLabelSymbol 实际上是内部的,所以我无法访问它的属性。 model.GetConstantValue(label) 返回 null

但考虑到 Roslyn 总是分发接口(interface),我相信这是有原因的,而且疯狂地转换对我来说感觉有点老套。有更好的选择吗?

注意:我这样做是为了将 C# 语法翻译成另一种语言。从技术上讲,首先是一个单独的 AST,然后再次转换为文本。上面的代码来自 CSharpSyntaxWalker,我可能只是将部分转换的 switch 语句存储起来,继续访问它的后代并分段构建它。

但这意味着有更多的状态,在六个不同的位置构建语句,这会导致代码难以阅读和遵循。如果可能的话,我宁愿避免在这里使用它。

最佳答案

最接近 API 的是 semanticModel.GetConstantValue 方法,但您仍然需要像这样将 Value 节点传递给它:

section.Labels
.OfType<CaseSwitchLabelSyntax>()
.Select(l => semanticModel.GetConstantValue(l.Value))
.ToArray()

如您所见,无论如何都需要过滤掉 CaseSwitchLabelSyntax

关于c# - 在 Roslyn 中获取 case 标签常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27267489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com