首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用roslyn检测外部api调用

使用roslyn检测外部api调用
EN

Stack Overflow用户
提问于 2019-04-21 03:50:27
回答 2查看 139关注 0票数 0

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

我试着找出怎么做,但没有成功。

示例:

代码语言:javascript
运行
复制
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 ?
}

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-21 04:57:42

要实现这一点,您可以检查InvocationExpressionSyntax下接收到的ISymbolDeclaringSyntaxReferences是否为空。更清楚地说,您还可以通过检查IsImplicitlyDeclared是否为假来确保此符号不是由编译器生成的

代码语言:javascript
运行
复制
  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;
  }
票数 1
EN

Stack Overflow用户

发布于 2019-04-25 20:25:44

当你说“我的代码”或“外部代码”时,你需要定义它到底是什么意思。

假设“我的代码”表示“编译到当前程序集中的代码”,而外部代码表示“来自引用的程序集的代码”,找到它的最简单方法是比较程序集。

假设您有一个SyntaxNodeAnalysisContext context和一个InvocationExpressionSyntax node,您可以按如下方式找到要调用的方法的符号:

代码语言:javascript
运行
复制
var symbol = context.SemanticModel.GetSymbolInfo(node, context.Cancellationtoken);

请记住,该符号可能为空,因此请对其进行测试。

现在,您可以比较程序集:

代码语言:javascript
运行
复制
bool fromSameAssembly = context.Compilation.Assembly.Equals(symbol.ContainingAssembly);

另一种选择是查看符号的位置:

代码语言:javascript
运行
复制
bool isInMetadata = symbol.Locations.Any(loc => loc.IsInMetadata);
bool isInSource = symbol.Locations.Any(loc => loc.IsInSource);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55777163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档