【问题标题】:How to get SyntaxNode "MethodDeclarationSyntax" from Semantic "Method"?如何从语义“方法”中获取 SyntaxNode“MethodDeclarationSyntax”?
【发布时间】:2019-08-21 17:43:58
【问题描述】:

语法模型和语义模型通信

我有一个 "InvocationExpressionSyntax" "invocation" ,我想从中访问 "MethodDeclarationSyntax"

不要只是比较他们的名字,因为方法参数可能不同。

通过使用语义模型,我可以访问调用的操作。通过操作,我可以访问 TargetMethod。我想获得该方法的 MethodDeclarationSyntax

var operation = (IInvocationOperation) semanticModel.GetOperation(invocation);
var methodInvoked = operation.TargetMethod;

【问题讨论】:

  • 你真的想要声明语法吗?还是你想知道参数?
  • 我需要知道声明语法来检查方法体

标签: c# roslyn


【解决方案1】:

你可以使用这个方法

private static SyntaxNode GetDeclarationSyntaxNode(InvocationExpressionSyntax invocationSyntax, SemanticModel semanticModel)
{
    var methodSymbol = (IMethodSymbol) semanticModel.GetSymbolInfo(invocationSyntax).Symbol;
    var syntaxReference = methodSymbol.DeclaringSyntaxReferences.FirstOrDefault();

    return syntaxReference?.GetSyntax();
}

有详细解释Roslyn Get Method Declaration from InvocationExpression

编辑: 在代码中包含空条件运算符

【讨论】:

  • 太棒了,这正是我所需要的。我为重复道歉
  • 您的代码预计 methodSymbol.DeclaringSyntaxReferences 可能为空,并且调用 syntaxReference 而不考虑它。
  • 谢谢,我在示例代码中写了空条件运算符
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多