Kann ich die anrufende Instanz innerhalb einer Methode über Reflektion / Diagnose bekommen?

StackOverflow https://stackoverflow.com/questions/97193

  •  01-07-2019
  •  | 
  •  

Frage

Gibt es eine Möglichkeit über System.Reflection, System.Diagnostics oder andere einen Verweis auf die aktuelle Instanz zu erhalten, die eine statische Methode ruft, ohne es in dem Verfahren verläuft selbst?

Zum Beispiel etwas in diese Richtung

class A
{
    public void DoSomething()
    {
        StaticClass.ExecuteMethod();
    }
}

class B
{
    public void DoSomething()
    {
        SomeOtherClass.ExecuteMethod();
    }
}
public class SomeOtherClass
{
    public static void ExecuteMethod()
    {
        // Returns an instance of A if called from class A
        // or an instance of B if called from class B.
        object caller = getCallingInstance();
    }
}

Ich kann die Art erhalten mit System.Diagnostics. StackTrace.GetFrames , aber gibt es eine Möglichkeit, einen Hinweis auf die tatsächliche Instanz zu bekommen?

Ich bin mir bewusst, die Probleme mit Reflexion und Leistung, sowie statischer statischen Anrufe, und dass dies in der Regel, vielleicht sogar fast univerally, nicht der richtige Weg, dies zu nähern. Ein Teil des Grundes dieser Frage ist, ich war gespannt, ob es machbar; wir sind vorbei zur Zeit die Instanz in.

ExecuteMethod(instance)

Und ich frage mich, ob dies möglich war und die Instanz zugreifen zu können.

ExecuteMethod()

@Steve Cooper: Ich hatte nicht die Erweiterungsmethoden in Betracht gezogen. Eine gewisse Abweichung davon funktionieren könnte.

War es hilfreich?

Lösung

Ich glaube nicht, Sie können. Auch gibt die Stacktrace und StackFrame- Klassen nur Sie Informationen zu nennen, nicht auf Instanzen zugreifen.

Ich bin gerade nicht sicher, warum Sie dies tun wollen würde, aber wissen, dass selbst wenn Sie es tun, könnte es wahrscheinlich sehr langsam sein würde.

Eine bessere Lösung wäre die Instanz zu einem Thread lokalen Kontext zu schieben, bevor ExecuteMethod aufrufen, die Sie innerhalb abgerufen werden kann oder einfach nur die Instanz übergeben.

Andere Tipps

Betrachten wir das Verfahren eine Erweiterungsmethode zu machen. Definieren Sie es als:

public static StaticExecute(this object instance)
{
    // Reference to 'instance'
}

Es heißt wie:

this.StaticExecute();

Ich kann nicht einen Weg finden zu tun, was Sie direkt tun wollen, aber ich kann nur vermuten, dass, wenn Sie etwas finden, Sie für statische Methoden achten, die keine haben, und anonyme Methoden, die wird automatisch generierten Klassen Instanzen haben, die ein wenig seltsam sein wird.

Ich frage mich, ob Sie nur das Objekt in rufenden als richtigen Parameter übergeben sollte. Schließlich ist ein static ein Hinweis, dass diese Methode nicht auf alles hängt anders als seine Eingabeparameter. Beachten Sie auch, dass diese Methode eine Hündin sein kann, wie jeder Test-Code zu testen, schreiben Sie nicht die gleiche Aufgabe wie das rufenden Laufsystem haben.

Im Falle einer statischen Methode, um Ihre statische Methode aufrufen, gibt es keinen Aufruf Instanz.

Finden

eine andere Art und Weise zu tun, was Sie zu tun versuchen.

Just hat ExecuteMethod ein Objekt übernehmen. Dann haben Sie die Instanz, egal was.

Ich fühle mich wie ich etwas fehle, hier. Die statische Methode kann von buchstäblich überall aufgerufen werden. Es gibt keine Garantie, dass eine Klasse A oder Klasse B Instanz überall in dem Call-Stack angezeigt.

Es muss ein besserer Weg, um zu erreichen, was Sie zu tun versuchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top