【问题标题】:Find classes which derive from a specific base class with Roslyn使用 Roslyn 查找派生自特定基类的类
【发布时间】:2015-12-17 22:09:28
【问题描述】:

this page 上,建议使用以下代码查找派生自给定类型的类,但此代码不起作用,因为以下行

var symbol = _model.GetDeclaredSymbol(node);

返回 ISymbol,而不是预期的 INamedTypeSymbol。

this page 上的常见问题解答中,为了获取变量声明的类型,建议使用以下代码。但是,这也会在运行时引发异常,表示强制转换为 ILocalSymbol 无效。

var type = ((ILocalSymbol)model.GetDeclaredSymbol(variableDeclarator)).Type;

我尝试查看 Roslyn 源代码以找出一种方法并尝试了它们,但到目前为止没有成功。

我想做的是,检测解决方案中派生自 EntityFramework 的 DbContext 类的所有类。有人可以建议我找到这个的方法吗?提前致谢!

【问题讨论】:

  • 你在哪个节点上操作? GetDeclaredSymbol 返回什么?
  • 感谢您的回答,我意识到问题所在。发送到 GetDeclaredSymbol 方法的节点参数未正确动态分派。这就是为什么它调用 GetDeclaredSymbol 的错误重载。所以我删除了这个问题。

标签: c# roslyn


【解决方案1】:

想出了问题所在。也许会帮助别人不要浪费太多时间。

Microsoft.CodeAnalysis 命名空间中的 ModelExtensions 类有一个名为 GetDeclaredSymbol 的方法声明。需要调用的方法是命名空间 Microsoft.CodeAnalysis.CSharp 中的类 CSharpExtensions 中的方法。如果您已经在类中使用了 Microsoft.CodeAnalysis 语句,则调用 ModelExtensions 上的 GetDeclaredSymbol 方法,对我来说就是这种情况。花了我时间弄清楚。

应该调用 CSharpExtensions 类中的这个方法:

public static INamedTypeSymbol GetDeclaredSymbol(
  this SemanticModel semanticModel, 
  BaseTypeDeclarationSyntax declarationSyntax, 
  CancellationToken cancellationToken = default(CancellationToken));

【讨论】:

  • GetDeclaredSymbol 被键入为返回一个 ISymbol,但返回的符号将实现一些更具体的类型,如 INamedTypeSymbol。所有这些助手所做的只是将其具体转换——您始终可以使用更具体的基本类型进行“is”或“as”检查。
  • 非常感谢
猜你喜欢
  • 1970-01-01
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
  • 2019-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多