使用 Roslyn,如何检查 class 是否来自本地项目,而不是 BCL 或 Nuget(等)?

Using Roslyn, how to check if class comes from a local project, not the BCL or Nuget (etc)?

我想写一个 Roslyn 代码分析器;如果 ObjectCreationExpression 正在从本地 class 创建对象(在当前项目或当前解决方案中的项目中),则需要确定;或者如果 class 来自其他地方,例如基础 Class 库或 Nuget 包等

如何辨别 class 来自 Roslyn?

只有在语义模型的帮助下才能做到这一点。您可以获取构造函数的符号,并通过 检查类型来自何处,例如:

// ObjectCreationExpression node == ...;
// SemanticModel model = ...;
var symbol = model.GetSymbolInfo(node).Symbol; // the constructor symbol
var type = symbol.ContainingType; // the class symbol
var isFromSource = type.DeclaringSyntaxReferences.Length > 0