2014-11-03 43 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