2014-11-03 40 views
2

所以我還想尋找到方法組ID implcitly投委派以下地方:如何檢測在Roslyn中委託轉換的隱式方法?

EventHandler a = method; 

和明確的委託創建區分它們

EventHandler a = new EventHandler(method); 

類型信息和轉換看起來完全一樣的兩個這些。有沒有辦法使用語義模型來做到這一點,而無需遍歷樹並試圖找到一個父新的對象表達式?

+0

我認爲你需要使用'SyntaxWalker',並在分配給'delegate'時尋找缺失的new。 – AlexanderBrevig 2014-11-03 14:07:50

+1

你如何找到你首先要傳遞給'SemanticModel'的節點? – 2014-11-03 20:10:00

+0

例如,每個簡單的名稱節點 – 2014-11-04 04:53:44

回答

1

這些地方可以粗略地走二進制表示的節點,展望右鍵式變換中可以看出:

void VisitBinaryExpression(BinaryExpressionSyntax binaryExpression) 
{ 
    var conversion = semanticModel.GetConversion(binaryExpression.Right); 
    if (conversion.IsMethodGroup) 
    { 

    } 
} 

它看起來並不很可靠,但,這就是我發現至今。

+0

訪問者遍歷樹。你知道的,對吧? – Rsh 2014-11-06 07:14:30

+0

嗯,是的,但在這種情況下,您只需要訪問BinaryExpression節點 – 2014-11-06 07:55:47

+0

據我所知,只爲一種類型的節點寫入訪問者並不妨礙遍歷所有的樹。 順便說一句,如果你想使用訪問者,我想分配表達式可能是一個更好的訪問節點。 – Rsh 2014-11-06 17:50:55