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 关注
- 136 浏览
添加回答
举报