2015-07-19 90 views
0

一个特定的基类,在this page下面的代码获得建议以找到从给定类型派生类的类,但是这个代码不工作,因为下面一行查找从与罗斯林

var symbol = _model.GetDeclaredSymbol(node); 

回报ISymbol,而比预期的INamedTypeSymbol。

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

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

我试图调查Roslyn源代码找出一种方法,并尝试使用它们,但目前为止没有成功。

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

+0

你在运行什么节点? GetDeclaredSymbol返回什么? – SLaks

+0

谢谢你的回答,我意识到问题所在。发送给GetDeclaredSymbol方法的节点参数未被正确动态分派。这就是为什么它调用GetDeclaredSymbol的错误重载。所以我删除了这个问题。 – remediable

回答

1

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

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)); 
+1

GetDeclaredSymbol键入为返回ISymbol,但返回的符号将实现一些更具体的类型,如INamedTypeSymbol。所有这些助手所做的只是特别强调 - 您可以随时使用更具体的基本类型进行'是'或'as'检查。 –