| |
VB.NET - Ein- und UmsteigerSystem.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 | |
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. | |
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. | |
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)
'..... | |
Re: System.Reflection.Parameterinfo: Referenz auf reale Variable | | | Autor: harpo6618 | Datum: 10.04.17 07:54 |
| Gute Idee, vielen Dank. | |
| 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 |
|
|
sevAniGif (VB/VBA)
Anzeigen von animierten GIF-Dateien
Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|
|
|
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
|
|