2015-07-19 157 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'檢查。 –