Frage

  

Mögliche Duplizieren:
   Wie kann ich die Methode zu finden, die den aktuellen genannt Methode?

Ich habe eine Methode in einem Objekt, das aus einer Reihe von Orten innerhalb des Objekts aufgerufen wird. Gibt es eine schnelle und einfache Möglichkeit, den Namen der Methode zu erhalten, die diese beliebte Methode genannt.

Pseudo-Code Beispiel:

public Main()
{
     PopularMethod();
}

public ButtonClick(object sender, EventArgs e)
{
     PopularMethod();
}

public Button2Click(object sender, EventArgs e)
{
     PopularMethod();
}

public void PopularMethod()
{
     //Get calling method name
}

Im PopularMethod() würde ich gerne den Wert von Main sehen, ob es von Main genannt wurde ... Ich mag „ButtonClick“ sehen, ob PopularMethod() von ButtonClick genannt wurde

Ich war auf der Suche auf dem System.Reflection.MethodBase.GetCurrentMethod() aber das wird mir nicht den Rufmethode bekommen. Ich habe an der StackTrace Klasse aussehen, aber ich habe nicht wirklich eine ganze Stack-Trace wird jedes Mal dieser Methode aufgerufen genieße ausgeführt wird.

War es hilfreich?

Lösung

Ich glaube nicht, es ohne Verfolgung des Stapels durchgeführt werden kann. Allerdings ist es ziemlich einfach, das zu tun:

StackTrace stackTrace = new StackTrace();
MethodBase methodBase = stackTrace.GetFrame(1).GetMethod();
Console.WriteLine(methodBase.Name); // e.g.

Aber ich glaube, man muss sich wirklich stoppen und zu fragen, ob dies notwendig ist.

Andere Tipps

In .NET 4.5 / C # 5, das ist ganz einfach:

public void PopularMethod([CallerMemberName] string caller = null)
{
     // look at caller
}

Die Compiler fügt den Namen des Anrufers automatisch; so:

void Foo() {
    PopularMethod();
}

wird in "Foo" passieren.

Das ist eigentlich ganz einfach.

public void PopularMethod()
{
    var currentMethod = System.Reflection.MethodInfo
        .GetCurrentMethod(); // as MethodBase
}

Aber Vorsicht durch, ich bin ein bisschen skeptisch, wenn inlining die Methode eine Wirkung hat. Sie können dies tun, um sicherzustellen, dass der JIT-Compiler nicht in die Quere kommen wird.

[System.Runtime.CompilerServices.MethodImpl(
 System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public void PopularMethod()
{
    var currentMethod = System.Reflection.MethodInfo
        .GetCurrentMethod();
}

die anrufende Methode zu erhalten:

[System.Runtime.CompilerServices.MethodImpl(
 System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public void PopularMethod()
{
    // 1 == skip frames, false = no file info
    var callingMethod = new System.Diagnostics.StackTrace(1, false)
         .GetFrame(0).GetMethod();
}

Übergeben Sie einfach in einem Parameter

public void PopularMethod(object sender)
{

}

IMO:. Wenn es für Veranstaltungen gut genug ist es sollte dafür gut genug sein

Ich habe oft festgestellt, mein Selbst, dies zu tun zu wollen, hat aber immer das Design meines Systems Refactoring enden, so bekomme ich nicht diesen „Schwanz mit dem Hund wedelt“ anti-Muster. Das Ergebnis ist immer eine robustere Architektur.

Während Sie die meisten definitley den Stapel zurückverfolgen können und herauszufinden, es auf diese Weise heraus, würde ich Sie bitten, Ihr Design zu überdenken. Wenn Ihre Methode über eine Art von „Staat“ wissen muß, würde ich sagen, nur eine ENUM oder etwas, erstellen und die zu Ihrem PopularMethod als Parameter (). Etwas in diese Richtung. Basierend auf, was Sie veröffentlichen, Overkill IMO wäre es, den Stapel zu verfolgen.

Ich glaube, Sie brauchen die StackTrace Klasse zu verwenden und dann auf dem nächsten Frame StackFrame.GetMethod().

Dies scheint eine seltsame Sache Reflection für obwohl zu verwenden. Wenn Sie PopularMethod definieren, können nicht einen Parameter oder etwas gehen definieren, um die Informationen übergeben Sie wirklich wollen. (Oder setzen in auf einer Basisklasse oder so ...)

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