Par exemple:Roslyn: L'analyse de l'objet appelant la méthode
SqlCommand command = new SqlCommand();
SqlDataReader datareader = command.ExecuteReader();
Le nœud d'invocation est ici command.ExecuteReader()
. Comment puis-je, en utilisant roslyn, obtenir le jeton/noeud d'identificateur de variable de command
à partir du nœud d'invocation? En supposant que ce nœud d'invocation peut avoir plusieurs autres appels de méthode avant lui, par ex. classA.methodA().methodB().classB.methodC(command.ExecuteReader())
et donc obtenir des identifiants par node.DescendantNodes
pourrait ne pas être utile. La solution que je pensais était d'obtenir le SpanStart de ExecuteReader
en premier, puis en obtenant le symbole de command
en appelant SymbolFinder.FindSymbolAtPosition
avec la position de ExecuteReader.SpanStart - 2
. Cependant, je ne suis pas sûr si cette solution peut gérer chaque situation. L'application sur laquelle je travaille est un analyseur de code statique.
En fin de ceux-ci sont tout simplement enchaîné invocations/simple membre accède. Si vous obtenez l'invocation la plus interne (ou 'SimpleMemberAccessExpression') vous avez ce que vous voulez. Regardez le parent immédiat au lieu de tous les ancêtres. –
est là comme une meilleure façon au lieu de coder en dur? Par exemple, obtenir le symbole de l'appel de la méthode, puis à partir du symbole, détermine l'instance d'un objet appelant la méthode. par exemple: 'ClassA varA = new ClassA(); varA.methodA() 'obtient le symbole de' methodA() 'et découvre que' varA' l'appelle. –
Que voulez-vous dire par "coder en dur"? Si vous voulez cette invocation, vous devez écrire le code qui obtient l'invocation. –