Bei der Verwendung von Reflection ist es möglich, den Aufruf-Stack zu erhalten (abgesehen davon, dass es aufgrund von JIT-Optimierungen eine grobe Näherung sein kann), indem System.Diagnostics.StackTrace verwendet wird und die enthaltenen StackFrame-Objekte untersucht werden.Wie bekomme ich das ausführende Objekt für einen Stackframe?
Wie kann ich einen Verweis auf das Objekt (den this-Zeiger) erhalten, auf dem eine Methode in einem Stapelrahmen ausgeführt wird?
Ich weiß, dass ich die MethodBase abrufen kann, indem ich GetMethod() für das Stack-Frame-Objekt abrufe, aber was ich suche, ist etwas wie GetObject(), das natürlich Null zurückgibt, wenn die Methode statisch ist). Es scheint, als ob das Stack-Frame-Objekt nur nach statisch bestimmten Informationen wie Methodeninformationen, Originaldateien usw. abgefragt werden kann.
Der VS-Debugger weiß (obwohl er wahrscheinlich eine andere Methode zum Erhalt der Call-Stack-Trace verwendet) Doppelklicken Sie auf einen Stapelrahmen im Call-Stack-Fenster und sehen Sie sich die Werte der lokalen und Klassenfelder an.
EDIT: Zur Klarstellung: Ich möchte das Objekt Instanz, auf dem die Methode aufgerufen wurde. Id.e .: Wenn die Methode Foo() auf der Objektinstanz A irgendwo auf dem Aufrufstapel aufgerufen wird und auf die Methode, die ich die Stapelverfolgung verwende, kaskadiert, möchte ich einen Bezug auf A erhalten, von wo aus ich die Stapelverfolgung durchführe. (Nicht der deklarierende Typ der Methodenbasis)
Ich weiß, dass dieser Zeiger an die übergeben wird aufgerufene Methode auf dem Aufruf-Stack durch den Aufrufer, weshalb die nicht vorhandene GetObject() Null zurückgeben würde, wenn es eine statische Methode wäre, und eine Kopie des kanonischen "This" -Zeigers in einer Instanzmethode. Allerdings stimme ich Ihrem Argument Nr. 1 zu, mit der Ausnahme, dass der Zugriff auf das Objekt leicht eingeschränkt werden kann, indem die entsprechende Berechtigung vom Entwurf gefordert wird. –
Das eigentliche Problem ist, dass ein StackFrame nur einige Metadaten über Ihren Code enthält, es ist keine Live-Version Ihres Codes. – Yona
Wie ich befürchtet habe. Aber ich hoffte, dass es noch andere Klassen geben würde. –