ExecutingMethodName est destiné à afficher le nom de la méthode de l'appelant. Par exemple:

  • static void Main(string[] args){Auxiliary.ExecutingMethodName();} doit afficher Main.

  • static void Foo(){Auxiliary.ExecutingMethodName();} devrait afficher Foo.

static class Auxiliary
{
    public static void ExecutingMethodName()
    {
        Console.WriteLine(new StackFrame(0).GetMethod().Name);
    }
}

class Program
{
    static void Main(string[] args)
    {
        Auxiliary.ExecutingMethodName();// should print Main
    }
    static void Foo()
    {
        Auxiliary.ExecutingMethodName();// should print Foo
    }    
}

Question

L'implémentation actuelle ci-dessus affiche toujours ExecutingMethodName ce n'est pas ce que je veux. Comment imprimer le nom de la méthode en cours d'exécution via une méthode auxiliaire?

1
I Eat Pork Every Single Day 24 janv. 2017 à 16:15

4 réponses

Meilleure réponse

Changez simplement 0 en 1 dans l'appel de frame de pile dans votre méthode (StackFrame(0) est votre position actuelle dans la pile d'appels et vous devez reculer d'un pas):

public static void ExecutingMethodName()
{
    Console.WriteLine(new StackFrame(1).GetMethod().Name);
}
2
Maksim Simkin 24 janv. 2017 à 13:26

Utilisez CallerMemberNameAttribute à la place en utilisant quelque chose du stackframe. Une manière beaucoup plus propre.

public static void ExecutingMethodName([CallerMemberName]string callerName= null)
{
    Console.WriteLine(callerName);
}
3
Janne Matikainen 24 janv. 2017 à 13:27

Utilisez le code ci-dessous. Vous devez utiliser StackFrame(1), StackFrame(2) sera toujours le ExecutingMethodName, en fait vous devez imprimer l'appelant de ExecutingMethodName.

public static void ExecutingMethodName()
        {
            Console.WriteLine(new StackFrame(1).GetMethod().Name);
        }

Vous pouvez consulter StackFrame Constructor (Int32)

En C # 5, c'est devenu plus facile.

CallerMemberNameAttribute

2
vivek nuna 24 janv. 2017 à 13:28

Vous devez ignorer la première entrée dans le cadre de la pile (qui appartient à ExecutingMethodName):

public static void ExecutingMethodName()
{
    Console.WriteLine(new StackFrame(1).GetMethod().Name);
}
3
Sefe 24 janv. 2017 à 13:19