[.net] Puoi usare reflection per trovare il nome del metodo attualmente in esecuzione?



Answers

System.Reflection.MethodBase.GetCurrentMethod().Name;

http://msdn.microsoft.com/en-us/library/system.reflection.methodbase.getcurrentmethod.aspx

Question

Come dice il titolo: Riflessione può darti il ‚Äč‚Äčnome del metodo attualmente in esecuzione.

Sono propenso a non indovinare, a causa del problema di Heisenberg. Come si chiama un metodo che indicherà il metodo corrente senza cambiare il metodo corrente? Ma spero che qualcuno possa dimostrarmi che non sbaglio.

Aggiornare:

  • Parte 2: Potrebbe essere usato per cercare anche il codice all'interno di una proprietà?
  • Parte 3: come sarebbe la performance?

Risultato finale
Ho imparato a conoscere MethodBase.GetCurrentMethod (). Ho anche imparato che non solo posso creare una traccia dello stack, ma posso creare solo la cornice esatta di cui ho bisogno se voglio.

Per usare questo all'interno di una proprietà, basta prendere un .Substring (4) per rimuovere "set_" o "get_".




Prova questo...

    /// <summary>
    /// Return the full name of method
    /// </summary>
    /// <param name="obj">Class that calls this method (use Report(this))</param>
    /// <returns></returns>
    public string Report(object obj)
    {
        var reflectedType = new StackTrace().GetFrame(1).GetMethod().ReflectedType;
        if (reflectedType == null) return null;

        var i = reflectedType.FullName;
        var ii = new StackTrace().GetFrame(1).GetMethod().Name;

        return string.Concat(i, ".", ii);
    }



Prova questo all'interno del metodo Main in un programma di console vuoto:

MethodBase method = MethodBase.GetCurrentMethod();
Console.WriteLine(method.Name);

Uscita console:
Main




Che ne dici di questo:

StackFrame frame = new StackFrame(1);
frame.GetMethod().Name; //Gets the current method name

MethodBase method = frame.GetMethod();
method.DeclaringType.Name //Gets the current class name






EDIT: MethodBase è probabilmente un modo migliore per ottenere il metodo in cui ti trovi (al contrario di tutto lo stack chiamante). Sarei comunque preoccupato di inlining comunque.

È possibile utilizzare uno StackTrace all'interno del metodo:

StackTrace st = new StackTrace(true);

E l'aspetto dei frame:

// The first frame will be the method you want (However, see caution below)
st.GetFrames();

Tuttavia, tieni presente che se il metodo è in linea, non sarai all'interno del metodo che pensi di essere. È possibile utilizzare un attributo per impedire la inlining:

[MethodImpl(MethodImplOptions.NoInlining)]





Links