Zum Beispiel Aufruf:Roslyn: Analysieren des Objekts, das Verfahren
SqlCommand command = new SqlCommand();
SqlDataReader datareader = command.ExecuteReader();
Der Aufrufknoten ist hier command.ExecuteReader()
. Wie kann ich mit roslyn den Variablenbezeichner token/node von command
vom Aufrufknoten erhalten? Angenommen, dieser Aufrufknoten kann viele andere Methodenaufrufe davor haben, z. classA.methodA().methodB().classB.methodC(command.ExecuteReader())
und daher Bezeichner durch node.DescendantNodes
möglicherweise nicht nützlich sein. Die Lösung, an die ich dachte, war, zuerst den SpanStart von ExecuteReader
zu bekommen, dann das Symbol von command
durch Aufruf von SymbolFinder.FindSymbolAtPosition
mit der Position ExecuteReader.SpanStart - 2
. Ich bin jedoch unsicher, ob diese Lösung jede einzelne Situation bewältigen kann. Die Anwendung, an der ich arbeite, ist ein statischer Code-Analysator.
Am Ende diejenigen sind nur angekettet Anrufungen/einfaches Mitglied zugreift. Wenn Sie den innersten Aufruf (oder 'SimpleMemberAccessExpression') erhalten, haben Sie, was Sie wollen. Betrachte den unmittelbaren Elternteil anstelle aller Vorfahren. –
gibt es da einen besseren Weg, anstatt es hart zu codieren? B. das Symbol des Methodenaufrufs ermitteln und dann anhand des Symbols die Instanz eines Objekts ermitteln, das die Methode aufruft. zum Beispiel: 'ClassA varA = new ClassA(); varA.methodA() 'get symbol von' methodA() 'und herauszufinden, dass' varA' es aufgerufen hat. –
Was meinst du mit "hart codieren"? Wenn Sie diesen Aufruf wünschen, müssen Sie Code schreiben, der den Aufruf erhält. –