2 回答

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超2個(gè)贊
為了實(shí)現(xiàn)這一點(diǎn),您可以檢查您下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貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超3個(gè)贊
當(dāng)你說“我的代碼”或“外部代碼”時(shí),你需要定義你的意思。
假設(shè)“我的代碼”表示“編譯到當(dāng)前程序集中的代碼”,外部代碼表示“來自引用程序集的代碼”,這是找出它以比較程序集的最簡單方法。
假設(shè)您有一個(gè)SyntaxNodeAnalysisContext context
, 和一個(gè)InvocationExpressionSyntax node
, 您可以找到您正在調(diào)用的方法的符號,如下所示:
var symbol = context.SemanticModel.GetSymbolInfo(node, context.Cancellationtoken);
請記住,該符號可能為空,因此對其進(jìn)行測試。
您現(xiàn)在可以比較程序集:
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 關(guān)注
- 131 瀏覽
添加回答
舉報(bào)