第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 roslyn 檢測外部 api 調用

使用 roslyn 檢測外部 api 調用

C#
BIG陽 2022-12-24 10:11:13
我想知道如何檢測例如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 ?}謝謝
查看完整描述

2 回答

?
慕斯王

TA貢獻1864條經驗 獲得超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;

  }


查看完整回答
反對 回復 2022-12-24
?
狐的傳說

TA貢獻1804條經驗 獲得超3個贊

當你說“我的代碼”或“外部代碼”時,你需要定義你的意思。

假設“我的代碼”表示“編譯到當前程序集中的代碼”,外部代碼表示“來自引用程序集的代碼”,這是找出它以比較程序集的最簡單方法。

假設您有一個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);


查看完整回答
反對 回復 2022-12-24
  • 2 回答
  • 0 關注
  • 116 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號