2010-01-12 25 views
46

Questa è una specie di domanda stupida, ma è possibile ottenere il nome del metodo che viene attualmente eseguito da tale metodo?Ottieni il nome del metodo corrente

Public Sub SomeMethod() 

    Dim methodName as String = System.Reflection.[function to get the current method name here?] 

End Sub 

Grazie

+0

Verificare questo: http://geekswithblogs.net/opiesblog/archive/2006/06/29/83654.aspx –

+0

Questo è in realtà come ottenere il nome del metodo di chiamata, non il metodo attualmente in esecuzione. Ancora fico, però! –

+0

Possibile duplicato di [È possibile utilizzare la riflessione per trovare il nome del metodo attualmente in esecuzione?] (Http://stackoverflow.com/questions/44153/can-you-use-reflection-to-find-the-name-of -il metodo-attualmente in esecuzione) –

risposta

97
+10

utilizzare meglio la classe base: System.Reflection.MethodBase.GetCurrentMethod(); – marstone

+0

@marstone - Potresti spiegare perché, per favore? – PunkyGuy

+5

@PunkyGuy qualcuno ha detto: "Sebbene entrambe le chiamate abbiano esattamente lo stesso effetto, è in generale una cattiva idea invocare funzioni condivise su sottoclassi della classe su cui sono effettivamente definite". riferimento: http: //bytes.com/topic/visual-basic-net/answers/457334-methodinfo-methodbase – marstone

26

Gli altri metodi sono vicino a quello che è stato chiesto, ma non restituiscono il valore distringa. Ma questo fa:

Dim methodName$ = System.Reflection.MethodBase.GetCurrentMethod().Name 
+0

bingo! risolto per me –

1
Dim methodName As String = System.Reflection.MethodBase.GetCurrentMethod().Name 
3

Per garantire che nessuna delle risposte presentate a questa domanda in realtà funziona (System.Reflection.MethodBase.GetCurrentMethod().Name) in fase di esecuzione, è necessario aggiungere un attributo. Non ci sono opzioni di compilazione/runtime, che io sappia che si rompono questo metodo:

la funzione che si sta tentando di ottenere il nome di must be marked

  • F # [<System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)>]
  • VB: <System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)>

  • C#: [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]

Inoltre, al giorno d'oggi, non v'è l'operatore nameof() in VB, C# (and maybe F# soon) che per il vostro caso sarebbe nameof(SomeMethod) (credo che la sintassi sarebbe lo stesso per VB e C# qui)

3

Un altro approccio sarebbe quello di utilizzare Caller​Member​Name​Attribute dal System. Runtime Spazio dei nomi del Compiler Services per popolare un parametro facoltativo. Per esempio ...

Private Function GetMethodName(<System.Runtime.CompilerServices.CallerMemberName> 
    Optional memberName As String = Nothing) As String 

    Return memberName 

End Function 

La funzione sarebbe invocata come ci si aspetterebbe ...

Public Sub DoSomeWork() 
    Dim methodName As String = GetMethodName() 
    Console.WriteLine($"Entered {methodName}") 

    ' Do some work 
End Sub 

Piuttosto che 'solo' recuperare il nome del metodo, la funzione potrebbe anche fare uso del metodo nome recuperato per semplificare ulteriormente il codice. Per esempio ...

Private Sub TraceEnter(
    <System.Runtime.CompilerServices.CallerMemberName> 
    Optional memberName As String = Nothing) 

    Console.WriteLine($"Entered {memberName}") 

End Sub 

... che potrebbe essere utilizzato come questo ...

Public Sub DoSomeWork() 
    TraceEnter() 

    ' Do some work 

End Sub 

Altri attributi nello spazio dei nomi CompilerServices possono essere utilizzati in modo simile per recuperare il percorso completo (a compile time) del file sorgente e/o il numero di riga della chiamata. Vedere la documentazione CallerMemberNameAttribute per il codice di esempio.

Problemi correlati