2016-06-29 48 views
19

Sono stati cercati, cercati e sperati ma non è possibile trovare una risposta diretta.Utilizzo di nomeof per ottenere il nome del metodo corrente

Esiste comunque in C# 6.0 per ottenere il nome del metodo corrente utilizzando nameof senza specificare il nome del metodo?

sto aggiungendo i miei risultati dei test per un dizionario come questo:

Results.Add(nameof(Process_AddingTwoConsents_ThreeExpectedRowsAreWrittenToStream), result); 

preferirei se non avrei dovuto specificare il nome del metodo in modo esplicito in modo da poter copiare + incollare la linea, un non- esempio operativo:

Results.Add(nameof(this.GetExecutingMethod()), result); 

Se possibile, non desidero utilizzare Reflection.

UPDATE

Questo non è (come suggerito) un duplicato di this question. Sto chiedendo se è esplicitamente possibile fare uso di nameof senza (!) Riflessione per ottenere il nome del metodo corrente.

+1

E perché non usi questo: http://stackoverflow.com/questions/44153/can-you-use-reflection-to-find-the-name-of-the-currently-executing-method? – HimBromBeere

+0

È possibile utilizzare 'StackTrace' per ottenere tali informazioni, ma questo è lento. Per ottenere qualcosa di automatico è possibile utilizzare la generazione del codice (ad esempio uno strumento che viene eseguito prima del compilatore e sostituisce qualcosa con qualcos'altro) o AOP (vedere [questo] (http://stackoverflow.com/q/25803/1997232). – Sinatr

+0

Non lo farebbe? 'System.Reflection.MethodInfo.GetCurrentMethod(). Name' – Zorkind

risposta

47

Non è possibile utilizzare nameof per ottenere ciò, ma per quanto riguarda questa soluzione alternativa:

Il sotto non utilizza la riflessione diretta (come nameof) e non expli nome del metodo cit.

Results.Add(GetCaller(), result); 

public static string GetCaller([CallerMemberName] string caller = null) 
{ 
    return caller; 
} 

GetCaller restituisce il nome di qualsiasi metodo che lo chiama.

+0

Perché il down-vote? – user3185569

+0

Come aiuta? È necessario il chiamante del metodo di esecuzione, non il chiamante di 'GetCaller'; a meno che tu non stia proponendo di aggiungere un parametro facoltativo a * tutti * i metodi potenzialmente chiamabili per fare questo lavoro che è, francamente, orribile. – InBetween

+2

@InBetween L'OP ha dichiarato '" richiama il nome del metodo corrente "'. Questo fa esattamente quello che ha dichiarato! Hai solo bisogno di un metodo 'GetCaller' che puoi chiamare da qualsiasi luogo per ottenere il nome del metodo di esecuzione corrente. – user3185569

0

Se si desidera aggiungere il nome del metodo corrente nella lista dei risultati, allora è possibile utilizzare questo:

StackTrace sTrace= new StackTrace(); 
StackFrame sFrame= sTrace.GetFrame(0); 
MethodBase currentMethodName = sFrame.GetMethod(); 
Results.Add(currentMethodName.Name, result); 

Oppure è possibile utilizzare,

Results.Add(new StackTrace().GetFrame(0).GetMethod().Name, result);  
+3

Nota che probabilmente non è affidabile, poiché il metodo potrebbe essere inline. Mi aspetto anche che sia piuttosto lento. – svick

+0

In generale non si dovrebbero mai usare queste classi nel codice di produzione –

+1

'System.Reflection.MethodInfo.GetCurrentMethod()' lo farà più facilmente (e probabilmente più rapidamente) – GreatAndPowerfulOz

Problemi correlati