Welche Prozedur hat mich aufgerufen - Log-Ausgabe

    • VB.NET

    Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

      Welche Prozedur hat mich aufgerufen - Log-Ausgabe

      Moin Leute.
      Des öfteren kamen im Forum Fragen, woher der aktuelle Aufruf kam. Da gab es die Möglichkeit, dies über eine StackTrace-Instanz aufzuklären.
      Andersherum bietet sich die Möglichkeit, mit der Übergabe einer MemberInfo.GetCurrentMethod()-Instanz die erforderlichen Informationen zum Befüllen eines LogFiles zu bekommen.
      Als Beispiel habe ich eine kleine GUI mit 3 Button und 3 CheckBoxen:
      Spoiler anzeigen

      VB.NET-Quellcode

      1. Imports System.Reflection
      2. Public Class Form1
      3. Private Sub AllButton_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click, Button3.Click
      4. Log(MethodInfo.GetCurrentMethod(), sender)
      5. End Sub
      6. Private Sub AllCheckBox_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged, CheckBox2.CheckedChanged, CheckBox3.CheckedChanged
      7. Log(MethodInfo.GetCurrentMethod(), sender)
      8. End Sub
      9. Public Shared Sub Log(ByVal caller As MemberInfo, sender As Object)
      10. Dim message = "other Control"
      11. If sender.GetType() Is GetType(Button) Then
      12. Dim btn = CType(sender, Button)
      13. message = btn.Name
      14. ElseIf sender.GetType() Is GetType(CheckBox) Then
      15. Dim btn = CType(sender, CheckBox)
      16. message = String.Format("{0} {{{1}}}", btn.Name, btn.Checked)
      17. End If
      18. Debug.WriteLine(String.Format("{0}.{1} - {2}", caller.DeclaringType.Name, caller.Name, message))
      19. End Sub
      20. End Class
      Der Output ist dieser:

      Quellcode

      1. Form1.AllButton_Click - Button1
      2. Form1.AllButton_Click - Button2
      3. Form1.AllButton_Click - Button3
      4. Form1.AllCheckBox_CheckedChanged - CheckBox1 {True}
      5. Form1.AllCheckBox_CheckedChanged - CheckBox1 {False}
      6. Form1.AllCheckBox_CheckedChanged - CheckBox2 {True}
      7. Form1.AllCheckBox_CheckedChanged - CheckBox3 {True}
      8. Form1.AllCheckBox_CheckedChanged - CheckBox2 {False}
      9. Form1.AllCheckBox_CheckedChanged - CheckBox3 {False}
      So lässt sich die Aufruf-Reihenfolge und weitere Informationen zu den Controls sehr einfach ermitteln und loggen.
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!
      docs.microsoft.com/en-us/dotne…e?view=netframework-4.7.2

      Hat folgende Vorteile:
      1. Es verwendet kein Reflection sondern wird zur jitter zeit eingetragen.
      2. Die Ausgabe ist auch bei inlining akkurat. Die MethodInfo kann ggf die übergeordnete Methode geben, wenn die Methode geinlined wurde....
      3. Man spart sich Code und der Aufruf sieht viel sauberer aus...
      4. Es wurde extra für solche Fälle gemacht.
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---
      Geht noch eleganter, dann musst du nicht jedes mal von Hand den Parameter übergeben:
      Aufruferinformationen (Visual Basic)

      VB.NET-Quellcode

      1. Private Sub DoProcessing()
      2. TraceMessage("Something happened.")
      3. End Sub
      4. Public Sub TraceMessage(message As String,
      5. <System.Runtime.CompilerServices.CallerMemberName> Optional memberName As String = Nothing,
      6. <System.Runtime.CompilerServices.CallerFilePath> Optional sourcefilePath As String = Nothing,
      7. <System.Runtime.CompilerServices.CallerLineNumber()> Optional sourceLineNumber As Integer = 0)
      8. System.Diagnostics.Trace.WriteLine("message: " & message)
      9. System.Diagnostics.Trace.WriteLine("member name: " & memberName)
      10. System.Diagnostics.Trace.WriteLine("source file path: " & sourcefilePath)
      11. System.Diagnostics.Trace.WriteLine("source line number: " & sourceLineNumber)
      12. End Sub
      13. ' Sample output:
      14. ' message: Something happened.
      15. ' member name: DoProcessing
      16. ' source file path: C:\Users\username\Documents\Visual Studio 2012\Projects\CallerInfoVB\CallerInfoVB\Form1.vb
      17. ' source line number: 15


      Edit: Meh, mein Beitrag ist überflüssig, @jvbsl hat schon alles erwähnt.

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „slice“ ()

      @jvbsl @slice Im Studio 2017 und 2013 geht das sofort,
      leider funktioniert das ganze nicht im Studio 2010 (Framework 4.0), auf Arbeit bin ich leider an solch Steinkohle gebunden. ;(
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „RodFromGermany“ ()