2010-01-12 23 views
46

Esto es una pregunta tonta, pero ¿es posible obtener el nombre del método que se está ejecutando actualmente dentro de ese método?Obtener el nombre del método actual

Public Sub SomeMethod() 

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

End Sub 

Gracias

+0

Mira esto: http://geekswithblogs.net/opiesblog/archive/2006/06/29/83654.aspx –

+0

Así es como obtener el nombre del método de llamada, no el método que se está ejecutando actualmente. ¡Aún así genial! –

+0

Posible duplicado de [¿Se puede usar la reflexión para encontrar el nombre del método que se está ejecutando actualmente?] (Http://stackoverflow.com/questions/44153/can-you-use-reflection-to-find-the-name-of -el-actualmente-método-de-ejecución) –

Respuesta

97
+10

mejor use la clase base: System.Reflection.MethodBase.GetCurrentMethod(); – marstone

+0

@marstone - ¿Podría explicar por qué por favor? – PunkyGuy

+5

@PunkyGuy alguien dijo: "Aunque ambas llamadas tienen exactamente el mismo efecto, en general es una mala idea invocar funciones compartidas en subclases de la clase en la que están realmente definidas". referencia: http: //bytes.com/topic/visual-basic-net/answers/457334-methodinfo-methodbase – marstone

26

Los otros métodos están cerca de lo que se pedía, pero no devuelven el valorcadena. Sin embargo, esto hace:

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

¡bingo! resuelto para mí –

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

para garantizar que ninguna de las respuestas que se presentan a esta pregunta realmente funciona (System.Reflection.MethodBase.GetCurrentMethod().Name) en tiempo de ejecución, es necesario agregar un atributo. No hay banderas de compilador/tiempo de ejecución, que yo sepa que se rompen este método:

la función que está tratando de obtener el nombre de 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)]

Además, hoy en día, no es el operador nameof() en VB, C# (and maybe F# soon) que por su caso sería nameof(SomeMethod) (creo que la sintaxis sería la misma para VB y C# aquí)

3

Otro enfoque sería utilizar Caller​Member​Name​Attribute del Sistema. Tiempo de ejecución. Espacio de nombres de servicios de compilación para llenar un parámetro opcional. Por ejemplo ...

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

    Return memberName 

End Function 

La función se invoca como era de esperar ...

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

    ' Do some work 
End Sub 

En lugar de 'sólo' recuperar el nombre del método, la función podría también hacer uso del método nombre recuperado para simplificar aún más el código. Por ejemplo ...

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

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

End Sub 

... que podría ser utilizado como esto ...

Public Sub DoSomeWork() 
    TraceEnter() 

    ' Do some work 

End Sub 

Otros atributos del espacio de nombres CompilerServices se pueden usar de forma similar para recuperar la ruta completa (por lo tiempo de compilación) del archivo de origen y/o el número de línea de la llamada. Consulte la documentación de CallerMemberNameAttribute para el código de muestra.

Cuestiones relacionadas