2009-04-03 5 views
8

Voir cet exemple:Est-il possible d'obtenir la méthode de référence dans 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 

Puis-je obtenir le nom "quelque chose" à l'intérieur LogInfo?

Désolé pour la brièveté de cet article, je ne sais pas comment articuler correctement cette question. Je vais clarifier et élaborer au besoin.

Répondre

12

(EDIT: Suppression de l'utilisation inutile même de StackTrace - ce qui serait utile si vous vouliez imprimer plus d'informations qu'un seul cadre.)

Vous pouvez utiliser la classe StackFrame, mais il est assez cher (IIRC) et peut être légèrement incorrect en raison de l'inline.

EDIT: Quelque chose comme ceci: (le NoInlining est pour vous assurer qu'il se comporte correctement ...)

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: une raison particulière? –

6

Jetez un oeil à How can I find the method that called the current method?.

à VB Translated (Si tout va bien):

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

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

merci qui a fonctionné comme j'ai eu besoin. Je me demande pourquoi ce post n'est pas apparu dans mes recherches ... – Anders

+0

La seule raison pour laquelle j'ai pu le trouver, c'est parce que je l'avais déjà vu, j'ai dû chercher StackTrace et GetFrame juste pour le faire apparaître. Je vous recommande de prendre le conseil de Jon pour s'assurer que vous obtenez le bon cadre, il est l'expert .NET IMO. –

+0

Vous pouvez faire mieux que cela: il suffit de créer une instance du cadre de pile exact dont vous avez besoin plutôt que de cloner la pile entière. –

1

Vous pouvez utiliser le StackFrame ou StackTrace. Mais votre comportement pourrait différer dans les versions de version et dans le débogueur en raison de l'inlining. Donc, vos résultats pourraient ne pas être ce que vous attendez:

C#:

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

vb:

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

Modifier

Désolé juste que vous avez demandé réalisé vb.net. Je modifié ma réponse, mais la syntaxe vb peut-être pas droit

1

System.Reflection.MethodBase.GetCurrentMethod.Name fait la même chose et est apparemment plus facile d'obtenir le coup de

Questions connexes