2016-06-23 11 views

Antwort

19

Von C# 5 ab können Sie den Compiler bekommen es für Sie zu füllen, wie folgt aus:

using System.Runtime.CompilerServices; 

public static class Helpers 
{ 
    public static string GetCallerName([CallerMemberName] caller = null) 
    { 
     return caller; 
    } 
} 

In MyMethod:

public static void MyMethod() 
{ 
    ... 
    string name = Helpers.GetCallerName(); // Now name=="MyMethod" 
    ... 
} 

Beachten Sie, dass diese falsch verwenden können durch explizite Übergabe eines Wertes:

string notMyName = Helpers.GetCallerName("foo"); // Now notMyName=="foo" 
obwohl

public static void MyMethod() 
{ 
    ... 
    string name = nameof(MyMethod); 
    ... 
} 

Das garantiert nicht, dass Sie die gleichen Namen wie der Name der Methode verwenden, - wenn Sie nameof(SomeOtherMethod) verwenden sie einen Wert von "SomeOtherMethod" von haben:

In C# 6, dann ist es auch nameof Kurs. Aber wenn Sie es richtig machen, dann den Namen MyMethod zu sonst etwas Refactoring, jedes halbwegs anständige Refactoring-Tool wird die Nutzung von nameof auch ändern.

+0

Vielen Dank! –

+0

Danke für den Hinweis von C# 6.0 –

5

Verwendung Wie Sie gesagt, dass Sie nicht wollen, mit Reflexion zu tun, dann können Sie System.Diagnostics verwenden Methode Namen zu erhalten, wie unten :

using System.Diagnostics; 

public void myMethod() 
{ 
    StackTrace stackTrace = new StackTrace(); 
    // get calling method name 
    string methodName = stackTrace.GetFrame(0).GetMethod().Name; 
} 

Hinweis: Reflexion ist weit schneller als Stack-Trace-Verfahren.

+0

Danke für die Antwort –

+0

@BandaraKamal ist Antwort Jon Skeet besser als ich. Auch er hat Referenzen von neuesten C# -Versionen gegeben. Überlege dir also, seine Antwort zu akzeptieren. –