Vollständigen Funktionsnamen in Unterklasse ermitteln

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Vollständigen Funktionsnamen in Unterklasse ermitteln

    Moinmoin,

    ich stelle derzeit einige Klasen um und möchte zum Debuggen bei Fehlern in Messageboxen gerne den Namen der Funktion haben, in welcher eine Ausnahme oder ein Fehler auftritt.

    Derzeit ermittle ich den Namen in den Funktionen/Subs über …

    VB.NET-Quellcode

    1. Dim CurrentFunction As String = Reflection.MethodBase.GetCurrentMethod.Name

    Allerdings gibt mir dies nicht den Namen der übergeordneten Klasse(n) zurück. Gibt es eine Möglichkeit, die gesamte Struktur bis zur Funktion/Sub zu ermitteln?
    Als Alternative schreibe ich in jede Funktion/Sub den Namen der übergeordneten Klassen von Hand, dies wird allerdings echt umständlich.

    Grüße und ein schönes Wochenende
    Einfach mal n Haltepunkt setzen und in den Wert von Reflection.MethodBase.GetCurrentMethod reinschauen. Da lässt sich einiges finden. Vielleicht reicht das ja schon:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim Method = Reflection.MethodBase.GetCurrentMethod
    3. Dim ClassName = Method.DeclaringType.FullName
    4. End Sub
    Kann man natürlich kürzen, aber wenn Du nen Haltepunkt in Zeile#3 setzt, kannst Du Dir eben den Wert von Method anschauen und vielleicht entdeckst Du noch Dinge, die Dich auch interessieren.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Solltest du nicht alle Infos über die Exception erhalten bzw. inwiefern fehlen dir hier Infos?

    Bsp. wäre:

    VB.NET-Quellcode

    1. Try
    2. throw new Exception("Test")
    3. Catch ex as exception
    4. Dim stkTrace As New StackTrace(ex)
    5. Dim methodName As String = stkTrace.GetFrame(0).GetMethod.Name
    6. Throw ex
    7. End try

    Eventuell habe ich aber auch dein Problem falsch verstanden?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „korni“ ()

    VB.NET-Quellcode

    1. Dim CurrentFunction = (Reflection.MethodBase.GetCurrentMethod.DeclaringType.FullName & "." & (Reflection.MethodBase.GetCurrentMethod.Name).Trim("."c).Replace("ctor", "New")).Replace("+", ".")


    So funktionierts, vielen Dank :)

    Zum Teil ja korni, ich habe verwende kaum Try/Catch weil ich sämtliche möglichen "Fehler" direkt abfange, dadurch steht mir keine Exception zur Verfügung.

    Edit:
    Nicht unbedingt übersichtlich, vielleicht geht's auch noch einfacher?

    BlueLagoonX schrieb:

    weil ich sämtliche möglichen "Fehler" direkt abfange
    Wir sprechen uns wieder, wenn dem doch nicht so ist. ;)
    @korni Du brauchst keine Exception, um den StackTrace zu erhalten. Form mit zwei Button:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Test()
    4. End Sub
    5. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    6. Test()
    7. End Sub
    8. Private Sub Test()
    9. Dim stack = New StackTrace().ToString()
    10. Dim parts() = stack.Split(New Char() {CChar(vbCr), CChar(vbLf)}, StringSplitOptions.RemoveEmptyEntries)
    11. MessageBox.Show(parts(1))
    12. End Sub
    13. End Class
    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).
    VB-Fragen über PN / Konversation werden ignoriert!

    BlueLagoonX schrieb:

    VB.NET-Quellcode

    1. Dim CurrentFunction = (Reflection.MethodBase.GetCurrentMethod.DeclaringType.FullName & "." & (Reflection.MethodBase.GetCurrentMethod.Name).Trim("."c).Replace("ctor", "New")).Replace("+", ".")

    Nicht unbedingt übersichtlich, vielleicht geht's auch noch einfacher?


    vlt so:

    VB.NET-Quellcode

    1. Dim tp = Reflection.MethodBase.GetCurrentMethod
    2. Dim CurrentFunction = tp.DeclaringType.FullName & "." & tp.Name.Trim("."c).Replace("ctor", "New").Replace("+", ".")
    ungetestet
    wobei ich bezweifel, ob das .Trim("."c) wirklich nötig ist