vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
System.Reflection.Parameterinfo: Referenz auf reale Variable 
Autor: harpo6618
Datum: 07.04.17 10:37

Hallo Leute,
ich möchte eine Logging-Prozedur schreiben, die ich einfach in jeder Funktion/Prozedur aufrufen kann und die mir den Namen der aktuellen Funktion/Prozedur, deren Argumente und den Inhalt der Argumente (soweit möglich) in ein Logfile schreibt. Namen und Argumente bekomme ich über die System.Reflection-Methoden. Leider erhalte ich die Argumente nicht als Referenz auf die wirklichen Variablen. Ist es möglich, eine Referenz auf die reale Variable zu bekommen?

Hier die (vereinfachte) Logging-Prozedur:
Aufruf der Prozedur:
    ...
    Dim method As String = System.Reflection.MethodBase.GetCurrentMethod.Name
    Dim params As System.Reflection.ParameterInfo() = _
      System.Reflection.MethodBase.GetCurrentMethod.GetParameters
    CreateLogfileEntry(method, params)
    ...
 
Public Sub CreateLogfileEntry(ByVal method As String, _
                              ByVal params As System.Reflection.ParameterInfo())
 
        Dim param As System.Reflection.ParameterInfo
        Dim paramcount As Integer = params.Length
        Dim pVal As Object
        For p As Integer = 0 To paramcount - 1
            pVal = params.GetValue(p)
 
            Dim pType As Type = pVal.GetType()
            'hier hatte ich gehofft, dass pVal das Interface annimmt, welches 
            ' als Argument übergeben wurde, leider ist es vom Typ 
            ' "System.Reflection.RuntimeParameterInfo" (jedenfalls wird das zur 
            ' Laufzeit angezeigt, obwohl es das in MSDN gar nicht gibt).
 
            param = params(p)
 
            ...
 
        Next
 
        ...
 
    End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: System.Reflection.Parameterinfo: Referenz auf reale Variable 
Autor: Manfred X
Datum: 07.04.17 13:02

Hallo!

Bei der Parameter-Übergabe an eine Methode ist zu unterscheiden, ob es sich
um einen Wert- oder Referenztyp handelt und ob ByRef, ByVal oder Optional
übergeben worden ist.

Am einfachsten wäre es vermutlich, wenn Du als Parameter ein Array des Typs
"Object" an die Logging-Variable übergibst.
Beim Aufruf in einer Routine trägst Du die übergebenen Parameter in die
Array-Elemente ein.
Durch System-Reflections kannst Du vermutlich die für die Protokollierung
erforderlichen Angaben ermitteln.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: System.Reflection.Parameterinfo: Referenz auf reale Variable 
Autor: harpo6618
Datum: 07.04.17 14:42

Hallo Manfred X, vielen Dank.
Na ja, so ähnlich habe ich mir schon beholfen. Ich dachte nur, es gibt eine allgemeinere Lösung, bei der man den Aufruf der Protokollierung immer gleich gestalten kann, egal wie viele Argumente die Funktion/Prozedur hat.

Private Sub Sub1(pMap As IMap, pLayer As ILayer, pName As String)
 
        'so würde ich es gern machen, immer der gleiche Call ohne etwas ändern 
        ' zu müssen:
        Dim method As String = _
          System.Reflection.MethodBase.GetCurrentMethod.Name
        Dim params As System.Reflection.ParameterInfo() = _
        System.Reflection.MethodBase.GetCurrentMethod.GetParameters
        CreateLogfileEntry(method, params)
 
        'wenn ich Dich richtig verstanden habe, dann soll ich es so machen:
        Dim arr() As Object = {pMap, pLayer, pName}
        CreateLogfileEntry(method, arr)
        'dort dann das array durchgehen und die Werte, Namen etc. herauslesen
 
        '...
    End Sub
 
    Private Sub Sub2(pIdx As Integer, pLayerName As String)
        Dim method As String = _
          System.Reflection.MethodBase.GetCurrentMethod.Name
        Dim arr() As Object = {pIdx, pLayername}
        CreateLogfileEntry(method, arr)
        '...
 
    End Sub
Da ich eine größere Anzahl von Funktionen/Prozeduren habe, ist es etwas mühselig, das Array jedes Mal an die unterschiedliche Anzahl und die unterschiedlichen Argument-Namen anzupassen.
Aber da werde ich mich wohl durchkämpfen müssen, falls es nichts Besseres gibt.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: System.Reflection.Parameterinfo: Referenz auf reale Variable 
Autor: Manfred X
Datum: 07.04.17 15:01

Verwende für die Übergabe ein ParamArray.
Du kannst dann die Liste der Funktionsargumente direkt kopieren.
   Public Sub MyLogger(ByVal ParamArray params() As Object)
 
        For i As Integer = 0 To params.Length - 1
            '................
        Next i
 
    End Sub
Aufruf von Mylogger in einer Routine:
  Private Sub frmTest_Load(sender As System.Object, _
                 e As System.EventArgs) Handles MyBase.Load
 
        MyLogger(sender, e)
 
        '.....
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: System.Reflection.Parameterinfo: Referenz auf reale Variable 
Autor: harpo6618
Datum: 10.04.17 07:54

Gute Idee, vielen Dank.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel