AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Beispiel für Attribut an einem Methoden/Funktionsparameter
Thema durchsuchen
Ansicht
Themen-Optionen

Beispiel für Attribut an einem Methoden/Funktionsparameter

Ein Thema von mjustin · begonnen am 2. Dez 2022 · letzter Beitrag vom 2. Dez 2022
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.222 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: Beispiel für Attribut an einem Methoden/Funktionsparameter

  Alt 2. Dez 2022, 12:00
Ich wüsste jetzt nicht, wie man herausbekommt, in welcher Methode man aktuell grade steckt. Wenn man die TRttiMethod kennt, kann man sich da ja weiterhangeln.

Eine Möglichkeit wäre ein TVirtualMethodInterceptor der eine bestehende Instanz wrapped und vor/nach jedem Methodenaufruf z.B. die Parameter prüft, verändert, oder was auch immer. Setzt halt nur virtuelle Methoden vorraus und macht das ganze bestimmt nicht schneller als ein hartkodiertes if not Assigned(p) then raise EArgumentNilException .
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.746 Beiträge
 
Delphi 12 Athens
 
#2

AW: Beispiel für Attribut an einem Methoden/Funktionsparameter

  Alt 2. Dez 2022, 12:17
Nja, im Prinzip in der Methode, welche kurz vor der aktuellen CodePosition beginnt, aber sicher ist sowas nicht.
Via RTTI alle Klassen+Methoden (nicht normale Prozeduren/Funktionen) durchlaufen und die Adressen vergleichen
oder über Debuginfos.

Ein __METHOD__, __FUNCTION__, __LINE__ bzw. eigene Preprozessor gibt es ja leider im "Delphi" nicht.
https://docwiki.embarcadero.com/RADS...inierte_Makros
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 2. Dez 2022 um 12:19 Uhr)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.014 Beiträge
 
Delphi 2009 Professional
 
#3

AW: Beispiel für Attribut an einem Methoden/Funktionsparameter

  Alt 2. Dez 2022, 12:20
Danke für das Feedback - ja, der TVirtualMethodInterceptor ist hier der Lösungsansatz, und ich stimme 100% zu dass ein Assert() auch funktioniert.

Im verlinkten Stackoverflow-Artikel war das Anwendungsbeispiel etwas fortgeschrittener, es sollte ein REST-Request-Parameter extrahiert werden. Durch die Annotation des Parameters mappt man dessen konkreten Wert auf den Anteil des Requests, in dem dieser enthalten ist. Das kann ein Path-, ein Query- oder ein Body-Parameter sein.
Dann könnte man Methodensignaturen dieser Art verwenden:
Delphi-Quellcode:
[GET]
function TMyResource.GetArtikelbestand([PathParam] ArtikelNr: string; [QueryParam] Farbe: string = ''): TArtikelbestandResponse;
begin
  // in ArtikelNr steht nun die aus dem HTTP Request extrahierte Artikelnummer, und in Farbe entsprechend die Artikelfarbe (optional).
end;
Das würde dann aus der URL z.B. /api/v1/artikel/12345?farbe=blau die Parameter ermitteln und an die Methode weitergeben. Auch hier wäre ein Intercept notwendig, diesmal ausserdem ein Verändern der Parameterwerte, nicht nur ein Lesen.
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.746 Beiträge
 
Delphi 12 Athens
 
#4

AW: Beispiel für Attribut an einem Methoden/Funktionsparameter

  Alt 2. Dez 2022, 12:38
Sowas ähnliches geh auch im DataSnap bzw. RADServer von Emba,
welcher ebenfalls eine REST-Schnittstelle bietet.

Dazu dann auch noch Dinge ala Benutzerverwaltung/Zugriffsbeschränlungen einzelner Klassen oder Methoden.



Wie gesagt, hier wird die Funktion am Ende auf etwas Anderes umgeleitet und über das Framework aufgerufen, wo man vor dem Aufruf dann auch solche Prüfungen machen kann ... vor der Funktion und nicht erst darin.



Beim TVirtualMethodInterceptor wird die TypInfo der Klasse geklont, in der abgeleiteten VMT mit den InterceptorCalls die virtuellen Methoden umgeleitet und dann in der Instanz der KlassenZeiger umgebogen.
Leider auch bei ALLEN Virtuellen und nicht nur die Gewollten (könnte man aber anschließend selber wieder an der VMT rumfummeln/zurückbiegen).

beim Aufruf:
Adressen, Register und Stack in TInvokeInfo kopieren
intern mehrmals rumreichen
und am Ende wieder alles in Register/Stack schreiben und der CALL auf die originle Adresse.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 2. Dez 2022 um 12:40 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz