我正在尝试对nameof中的CSharpSyntaxWalker表达式进行操作,但是,我注意到AST中没有NameOfExpressionSyntax。取而代之的是,我得到一个InvocationExpressionSyntax,它的SemanticModel.GetSymbolInfo不返回匹配符号,并且调用的表达式是一个包含标识符 token IdentifierNameSyntax"nameof"

因此,要识别nameof表达式,我会在VisitInvocationExpression中添加一个特例,以查找GetSymbolInfo是否返回任何内容,如果不是,则查找标识符是否为nameof。但是,这听起来让我有些疑惑。有没有更好的方法可以将这种检测逻辑转移到解析器?

(P.S .:我知道这可能是出于向后兼容性的原因而解析的;只是想知道是否存在用于区分nameof和常规调用的API。)

最佳答案

nameof表达式是编译时常量。您可以使用该事实将其与正常调用区分开。您可以在SematicModel.GetConstantValue()上调用InvocationExpressionSyntax。如果它是nameof,则返回Optional<object>.Value内的字符串/名称(HasValue也返回true)。

10-08 03:58