Rufen Sie den Namen der aktuellen Methode ab

70

Dies ist eine dumme Frage, aber ist es möglich, den Namen der Methode, die gerade ausgeführt wird, aus dieser Methode heraus abzurufen?

Public Sub SomeMethod()

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

End Sub

Vielen Dank

camainc
quelle
Überprüfen Sie dies heraus: geekswithblogs.net/opiesblog/archive/2006/06/29/83654.aspx
Brian Mains
Auf diese Weise erhalten Sie den Namen der aufrufenden Methode, nicht der aktuell ausgeführten Methode. Trotzdem cool!
Marc Bollinger

Antworten:

128

System.Reflection.MethodInfo.GetCurrentMethod();

herzmeister
quelle
11
Verwenden Sie besser die Basisklasse: System.Reflection.MethodBase.GetCurrentMethod ();
Marstone
1
@marstone - Könnten Sie bitte erklären, warum?
Gavin Ward
5
@PunkyGuy Jemand sagte: "Obwohl beide Aufrufe genau den gleichen Effekt haben, ist es im Allgemeinen eine schlechte Idee, Shared-Funktionen für Unterklassen der Klasse aufzurufen, für die sie tatsächlich definiert sind." Referenz: bytes.com/topic/visual-basic-net/answers/…
Marstone
Dies funktioniert in optimierten Situationen nicht immer. Manchmal wird die aktuelle Methode weg optimiert.
Maslow
42

Die anderen Methoden entsprechen in etwa dem, was gefragt wurde, geben jedoch den Zeichenfolgenwert nicht zurück . Aber das tut:

Dim methodName$ = System.Reflection.MethodBase.GetCurrentMethod().Name
Edward
quelle
6

Um sicherzustellen, dass eine der Antworten auf diese Frage System.Reflection.MethodBase.GetCurrentMethod().Namezur Laufzeit tatsächlich funktioniert ( ), müssen Sie ein Attribut hinzufügen. Es gibt keine Compiler- / Laufzeitflags, von denen ich weiß, dass sie diese Methode unterbrechen:

Die Funktion, deren Namen Sie abrufen möchten, muss markiert sein

  • 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)]

Heutzutage gibt es auch den nameof()Operator in VB, C # ( und vielleicht bald F # ), der für Ihren Fall wäre nameof(SomeMethod)(ich glaube, die Syntax wäre hier für VB und C # dieselbe).

Maslow
quelle
5

Ein anderer Ansatz wäre die Verwendung des Caller-Mitgliedsnamenattributs aus dem System. Runtime. Compiler Services-Namespace, um einen optionalen Parameter zu füllen. Zum Beispiel ...

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

    Return memberName

End Function

Die Funktion wird wie erwartet aufgerufen ...

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

    ' Do some work
End Sub

Anstatt nur den Methodennamen abzurufen, kann die Funktion auch den abgerufenen Methodennamen verwenden, um den Code weiter zu vereinfachen. Zum Beispiel...

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

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

End Sub

... was so verwendet werden könnte ...

Public Sub DoSomeWork()
    TraceEnter()

    ' Do some work

End Sub

Andere Attribute im CompilerServices-Namespace können auf ähnliche Weise verwendet werden, um den vollständigen Pfad (zur Kompilierungszeit) der Quelldatei und / oder die Zeilennummer des Aufrufs abzurufen. Beispielcode finden Sie in der CallerMemberNameAttribute-Dokumentation.

Frank Boyne
quelle
1
Dim methodName As String = System.Reflection.MethodBase.GetCurrentMethod().Name
Stephen G Tuggy
quelle