2009-04-03 17 views
8

ver este ejemplo:¿Es posible obtener el método de referencia en VB.NET?

''//file1.vb 
Sub Something() 
    ''//... 
    Functions.LogInfo("some text") 
    ''//... 
End Sub 

''//functions.vb 
Sub LogInfo(ByVal entry as String) 

    Console.WriteLine(entry) 

End Sub 

¿Puedo obtener el nombre "algo" dentro de loginfo?

Disculpa por la brevedad de esta publicación, no estoy seguro de cómo expresar correctamente esta pregunta. Voy a aclarar y elaborar según sea necesario.

Respuesta

12

(EDIT: Se ha eliminado el uso innecesario de StackTrace sí mismo - que sería útil si desea imprimir más información que sólo un marco.)

Usted puede utilizar la clase StackFrame, pero es bastante caro (IIRC) y puede ser un poco incorrecto debido a la inflación.

EDIT: Algo como esto: (el NoInlining es para asegurarse de que se comporta adecuadamente ...)

Imports System.Diagnostics 
Imports System.Runtime.CompilerServices 

Public Class Test 

    Shared Sub Main() 
     Something() 
    End Sub   

    <MethodImpl(MethodImplOptions.NoInlining)> _ 
    Shared Sub Something()   
     Functions.LogInfo("some text") 
    End Sub 

End Class 

Public Class Functions 

    <MethodImpl(MethodImplOptions.NoInlining)> _ 
    Public Shared Sub LogInfo (ByVal entry as String) 
     Dim frame as StackFrame = new StackFrame(1, False) 
     Console.WriteLine("{0}: {1}", _ 
          frame.GetMethod.Name, _ 
          entry) 
    End Sub 

End Class 
+0

Downvoters: alguna razón en particular? –

6

Tome un vistazo a How can I find the method that called the current method?.

Traducido al VB (con suerte):

Imports System.Diagnostics 
''// get call stack 
Dim stackTrace As New StackTrace() 

''// get calling method name 
Console.WriteLine(stackTrace.GetFrame(1).GetMethod().Name) 
+0

gracias que funcionó justo como lo necesitaba. Me pregunto por qué esa publicación no apareció en mis búsquedas ... – Anders

+0

La única razón por la que pude encontrarla fue porque la había visto antes, tuve que buscar StackTrace y GetFrame solo para que apareciera. Le recomendaría que siga el consejo de Jon para asegurarse de obtener el fotograma correcto, él es el experto en .NET de .NET. –

+0

Puede hacer algo mejor que esto: solo es posible crear una instancia del marco de pila exacto que necesita en lugar de clonar toda la pila. –

1

Puede utilizar el StackFrame o StackTrace. Pero su comportamiento puede ser diferente en compilaciones de lanzamiento que en ejecutables en el depurador debido a la incorporación. Por lo que sus resultados podrían ser no lo que esperas:

C#:

System.Diagnostics.StackFrame sf = new StackFrame(1); 
sf.GetMethod().Name; 

vb:

Dim sf as new StackFrame(1) 
sf.GetMethod().Name 

Editar

En este momento solo se dio cuenta de que pidió vb.net. He editado mi respuesta, pero la sintaxis VB podría no ser adecuado

1

System.Reflection.MethodBase.GetCurrentMethod.Name hace lo mismo y es aparentemente más fácil de conseguir la caída de

Cuestiones relacionadas