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;
}

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);
- 2 回答
- 0 關注
- 116 瀏覽
添加回答
舉報