2016-06-23 32 views

risposta

19

da C# 5 in poi è possibile ottenere il compilatore di compilarlo per voi, in questo modo:

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" 
    ... 
} 

Si noti che è possibile utilizzare questo torto passando un valore in modo esplicito:

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

In C# 6, c'è anche nameof:

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

che non garantisce che si sta usando lo stesso nome come il nome del metodo, anche se - se si utilizza nameof(SomeOtherMethod) avrà un valore di "SomeOtherMethod" di corso. Ma se hai capito bene, quindi rifatta il nome di MyMethod in qualcos'altro, uno strumento di refactoring semi-decente cambierà anche il tuo uso di nameof.

+0

Grazie mille! –

+0

Grazie per il riferimento da C# 6.0 –

5

Come lei ha detto che non si vuole fare utilizzando la riflessione quindi è possibile utilizzare System.Diagnostics per ottenere il nome del metodo come qui di seguito :

using System.Diagnostics; 

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

Nota: La riflessione è di gran lunga più veloce di metodo dello stack trace.

+0

Grazie per la risposta –

+0

@BandaraKamal La risposta di Jon Skeet è migliore di me. Inoltre ha dato riferimenti dalle ultime versioni di C#. Quindi considera di accettare la sua risposta. –