none
¿Cómo saber que método o evento ha utilizado el evento en el que estoy ejecutando? RRS feed

  • Pregunta

  • Buenos días,

    Quisiera saber como hago si al ejecutarse un Método obtener el nombre del método que lo invoco o ejecuto, sin especificarlo en la sección de paso de parámetros.

    Ejemplo

    private void metodo1(){ MostrarMensaje(); }
    
    private void metodo2(){ MostrarMensaje(); }
    
    private void metodo3(){ MostrarMensaje(); }
    
    //El método siguiente no se le puede pasar por parámetros el nombre del método que lo invocó.
    
    private void MostrarMensaje(){ Console.WriteLine(/*Función que obtiene el nombre del método que declaró a este método*/.toString());}

    ¿O esto no se puede hacer?

    Muchas gracias.

    private void metodo1(){ MostrarMensaje(); }
    private void metodo1(){ MostrarMensaje(); }
    private void metodo1(){ MostrarMensaje(); }
    miércoles, 13 de diciembre de 2017 11:33

Respuestas

  • Buenas,

    Se puede hacer obteniendo la pila de llamadas, y desde ahi extrayendo el metodo, te pongo un ejemplo en consola para que puedas probarlo

    using System;
    using System.Diagnostics;
    
    namespace test
    {
      class Program
      {
        static void Main(string[] args)
        {
          DoAction1();
          DoAction2();
          DoAction3();
          Console.Read();
        }
        static void DoAction1()
        {
          Console.WriteLine(string.Format("Accion ejecutada desde '{0}'",GetCaller()));
        }
        static void DoAction2()
        {
          Console.WriteLine(string.Format("Accion ejecutada desde '{0}'", GetCaller()));
        }
        static void DoAction3()
        {
          Console.WriteLine(string.Format("Accion ejecutada desde '{0}'", GetCaller()));
        }
        static string GetCaller()
        {
          //Obtenemos la lista haciendo skip al primer item, que es GetCaller
          StackTrace trace = new StackTrace(1);
          //Obtenemos el frame
          StackFrame frame = trace.GetFrame(0);
          //Obtenemos el metodo mediante reflexion
          System.Reflection.MethodBase caller = frame.GetMethod();
          //Retornamos el nombre del metodo
          return caller.Name;
        }
      }
    }

    Según tus necesitases, en el constructor de StackTrace le pasaras 0,1, o el numero de posiciones que te quieres saltar, por ejemplo para tu caso, yo diría que es 1 si escribes el código directamente en MostrarMensaje, si haces como yo un método y le llamas, serán 2, uno para saltarte GetCaller, y otro para saltarte MostrarMensaje, (pero tendrás que probarlo)

    El resultado es este

    Nos comentas si tienes dudas


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:


    miércoles, 13 de diciembre de 2017 11:46

Todas las respuestas

  • Buenas,

    Se puede hacer obteniendo la pila de llamadas, y desde ahi extrayendo el metodo, te pongo un ejemplo en consola para que puedas probarlo

    using System;
    using System.Diagnostics;
    
    namespace test
    {
      class Program
      {
        static void Main(string[] args)
        {
          DoAction1();
          DoAction2();
          DoAction3();
          Console.Read();
        }
        static void DoAction1()
        {
          Console.WriteLine(string.Format("Accion ejecutada desde '{0}'",GetCaller()));
        }
        static void DoAction2()
        {
          Console.WriteLine(string.Format("Accion ejecutada desde '{0}'", GetCaller()));
        }
        static void DoAction3()
        {
          Console.WriteLine(string.Format("Accion ejecutada desde '{0}'", GetCaller()));
        }
        static string GetCaller()
        {
          //Obtenemos la lista haciendo skip al primer item, que es GetCaller
          StackTrace trace = new StackTrace(1);
          //Obtenemos el frame
          StackFrame frame = trace.GetFrame(0);
          //Obtenemos el metodo mediante reflexion
          System.Reflection.MethodBase caller = frame.GetMethod();
          //Retornamos el nombre del metodo
          return caller.Name;
        }
      }
    }

    Según tus necesitases, en el constructor de StackTrace le pasaras 0,1, o el numero de posiciones que te quieres saltar, por ejemplo para tu caso, yo diría que es 1 si escribes el código directamente en MostrarMensaje, si haces como yo un método y le llamas, serán 2, uno para saltarte GetCaller, y otro para saltarte MostrarMensaje, (pero tendrás que probarlo)

    El resultado es este

    Nos comentas si tienes dudas


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:


    miércoles, 13 de diciembre de 2017 11:46
  • Olé. 

    Me lo aplico pero ya.

    Muchas gracias ;)

    Y esos apuntes me los anoto.

    miércoles, 13 de diciembre de 2017 14:53