2008-09-18 3 views
9

Gibt es eine Möglichkeit über System.Reflection, System.Diagnostics oder andere einen Verweis auf die aktuelle Instanz zu erhalten, die sich ohne den Weg es in dem Verfahren eine statische Methode ruft?Kann ich die aufrufende Instanz innerhalb einer Methode über Reflektion/Diagnose abrufen?

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 die Art bekommen kann System.Diagnostics.StackTrace.GetFrames verwenden, aber ist es eine Möglichkeit, einen Verweis auf die aktuelle Instanz zu bekommen?

Ich bin mir der Probleme mit Reflexion und Leistung, sowie statischen zu statischen Aufrufen bewusst, und dass dies im Allgemeinen, vielleicht sogar fast universell, nicht der richtige Weg ist, dies zu erreichen. Ein Teil des Grundes dieser Frage ist, dass ich neugierig war, ob es machbar war; Die Instanz wird gerade übergeben.

ExecuteMethod(instance) 

Und ich habe mich gefragt, ob dies möglich ist und weiterhin auf die Instanz zugreifen kann.

ExecuteMethod() 

@Steve Cooper: hatte ich nicht Erweiterungsmethoden in Betracht gezogen. Eine Variation davon könnte funktionieren.

Antwort

4

Ich glaube nicht, Sie können. Selbst die StackTrace- und StackFrame-Klassen geben nur Namensinformationen und keinen Zugriff auf Instanzen.

Ich weiß nicht genau, warum Sie das tun sollten, aber wissen Sie, dass selbst wenn Sie es könnten, es wahrscheinlich sehr langsam wäre.

Eine bessere Lösung wäre, die Instanz in einen lokalen Thread-Kontext zu verschieben, bevor ExecuteMethod aufgerufen wird, das Sie darin abrufen oder die Instanz übergeben können.

1

Lassen Sie ExecuteMethod einfach ein Objekt nehmen. Dann hast du die Instanz, egal was passiert.

8

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

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

Es ist wie genannt wird:

this.StaticExecute(); 

ich nicht so denken kann, zu tun, was Sie direkt tun wollen, aber ich kann nur vermuten, dass, wenn Sie etwas finden, Achten Sie auf statische Methoden, die keine haben werden, und auf anonyme Methoden, die Instanzen von automatisch generierten Klassen haben, was etwas merkwürdig ist.

Ich frage mich, ob Sie das aufrufende Objekt nur als richtigen Parameter übergeben sollten. Immerhin ist ein static ein Hinweis, dass diese Methode nur von ihren Eingabeparametern abhängt. Beachten Sie auch, dass diese Methode zu testen ist, da jeder von Ihnen geschriebene Testcode nicht das selbe aufrufende Objekt wie das laufende System hat.

+1

Dies ist eine sehr elegante Möglichkeit, dieses Problem zu lösen – ohmusama

0

Ich fühle mich wie ich etwas fehle, hier. Die statische Methode kann von buchstäblich überall aufgerufen werden. Es gibt keine Garantie dafür, dass eine Instanz der Klasse A oder der Klasse B an einer beliebigen Stelle im Aufrufstapel angezeigt wird.

Es muss einen besseren Weg geben, um zu erreichen, was auch immer Sie versuchen zu tun.

1

Im Falle einer statischen Methode, die Ihre statische Methode aufruft, gibt es keine aufrufende Instanz.

Finden Sie einen anderen Weg, um zu erreichen, was auch immer Sie versuchen zu tun.

Verwandte Themen