查找使用Roslyn从特定基类派生的类

时间:2015-07-19 19:42:48

标签: c# roslyn

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

var symbol = _model.GetDeclaredSymbol(node);

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

关于this page上常见问题解答的答案,为获取变量声明的类型,建议使用以下代码。但是,这也会在运行时抛出一个异常,说对ILocalSymbol的强制转换是无效的。

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

CSharpExtensions类中的此方法是应该调用的方法:

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