我正在尝试对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)。