2017-01-24 1 views
1

ExecutingMethodName est destiné à imprimer le nom de la méthode de l'appelant. Par exemple:Comment imprimer le nom de la méthode d'exécution en cours via une méthode auxiliaire?

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

  • static void Foo(){Auxiliary.ExecutingMethodName();} doit imprimer 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 toujours imprimer ExecutingMethodName ce n'est pas ce que je veux. Comment imprimer le nom de la méthode d'exécution en cours via une méthode auxiliaire?

Répondre

2

Il suffit de changer 0 à 1 dans l'appel StackFrame dans votre méthode (StackFrame(0) est votre position dans la pile d'currrent appel et vous avez besoin d'aller un pas en arrière):

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

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 il est devenu plus facile.

CallerMemberNameAttribute

3

Vous avez sauter 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

Utilisez le CallerMemberNameAttribute au lieu d'utiliser quelque chose du stackframe. Beaucoup plus propre.

public static void ExecutingMethodName([CallerMemberName]string callerName= null) 
{ 
    Console.WriteLine(callerName); 
} 
+0

Voté. Bonne idée. Quel est le but d'initialiser 'callerName = null'? –

+1

"Vous appliquez l'attribut CallerMemberName à un paramètre facultatif ayant une valeur par défaut Vous devez spécifier une valeur par défaut explicite pour le paramètre facultatif Vous ne pouvez pas appliquer cet attribut à des paramètres qui ne sont pas spécifiés comme facultatifs." à partir du lien MSDN fourni. –