使用 roslyn 检测外部 api 调用

我想知道如何检测例如InvocationExpressionSyntax是来自我的代码还是来自外部代码。


我试图找到如何去做,但没有成功。


例子。:


public async Task MyMethodAsync1()

{

   await MyMethodAsync2(); // How to know that this 'InvocationExpressionSyntax' is mine using roslyn ?

}


public async Task MyMethodAsync2()

{

  await Task.Delay(1); // How to know that this 'InvocationExpressionSyntax' is NOT mine using roslyn ?

}

谢谢


BIG阳
浏览 137回答 2
2回答

慕斯王

为了实现这一点,您可以检查您下DeclaringSyntaxReferences收到的来自是否为空。为了更清楚,您还可以通过检查是否为 false来确保此符号不是由编译器生成的ISymbolInvocationExpressionSyntaxIsImplicitlyDeclared  public static bool IsDeclareInMetadata(this SemanticModel semanticModel, SyntaxNode node)  {    var info = semanticModel.GetSymbolInfo(node);    return !(info.Symbol is null) && info.Symbol.DeclaringSyntaxReferences.IsDefaultOrEmpty && !info.Symbol.IsImplicitlyDeclared;  }

狐的传说

当你说“我的代码”或“外部代码”时,你需要定义你的意思。假设“我的代码”表示“编译到当前程序集中的代码”,外部代码表示“来自引用程序集的代码”,这是找出它以比较程序集的最简单方法。假设您有一个SyntaxNodeAnalysisContext context, 和一个InvocationExpressionSyntax node, 您可以找到您正在调用的方法的符号,如下所示:var symbol = context.SemanticModel.GetSymbolInfo(node, context.Cancellationtoken);请记住,该符号可能为空,因此对其进行测试。您现在可以比较程序集:bool fromSameAssembly = context.Compilation.Assembly.Equals(symbol.ContainingAssembly);另一种选择是查看符号的位置:bool isInMetadata = symbol.Locations.Any(loc => loc.IsInMetadata); bool isInSource = symbol.Locations.Any(loc => loc.IsInSource);
打开App,查看更多内容
随时随地看视频慕课网APP