In der folgenden Art:
%Vor%Ich möchte den Namen der Setter-Methode der "MyProperty" -Eigenschaft über RTTI wissen. Ich habe Folgendes versucht:
%Vor%Obwohl der Zeiger nicht Null ist, habe ich nur eine leere Nachricht. Hat jemand einen Tipp für mich?
P.S .: Ich benutze Delphi XE4, und ich weiß, dass ich Extended RTTI anstelle von Classic verwenden sollte, aber trotzdem kann ich in beiden Funktionen nicht machen, was ich will ... Also, jede Hilfe wird geschätzt. Danke für die Antworten.
Endgültige Ausgabe, Problem gelöst:
Hier ist der Code, der in der (Hilfe meiner Freunde und ...) RTTI-Einheit (DoSetValue-Methode der TRTTIInstanceProperty-Klasse) basiert:
%Vor%NUR FÜR VIRTUELLE EINSTELLUNGEN, für die Statik ist die Nachricht leer. Danke an alle!
Lesen Sie c:\rad studio.0\source\rtl\common\System.Rtti.pas
Der Setter der Eigenschaft kann
sein Und diese Fälle machen PropInfo^.SetProc
unterschiedliche Semantiken seines Wertes.
Die direkte Adresse gilt nur für statische Prozeduren. Für virtuelle Methoden fügst du einen VMT-Offset hinzu und nimmst die Code-Adresse aus dieser Speicherzelle, wie in dem erwähnten Code angegeben (würde aber aus Copyright-Gründen nicht angeben).
Oder du könntest einfach TRttiProperty.SetValue
benutzen und Delphi all die kleinen Details unter der Motorhaube machen lassen. Siehe Ссылка
BEARBEITEN:
Extended RTTI
anstelle von classic
one verwenden sollte - das ist fraglicher Anspruch. Extended RTTI
arbeitet bekanntermaßen merklich langsamer als der klassische. Weiß nicht, ob jemand es profiliert hat, aber ich vermute, dass dies hauptsächlich auf den langsamen Code von TValue
zurückzuführen ist. Sie können googeln und finden, dass viele Leute sich über die langsame Implementierung von TValue
beschwert haben und alternative mit fester Effizienz bereitgestellt haben. Da Extended RTTI
jedoch nur den Vorrat TValue
verwendet, kann er nicht von diesen Implementierungen profitieren und bleibt langsamer als der klassische. Sie können diesen Methodennamen abrufen, wenn
a) Verschieben Sie die Methode in den veröffentlichten Abschnitt (klassische RTTI funktioniert nur mit diesem Abschnitt (genauer gesagt - kompiliert mit {$ M +} Anweisung))
b) Verwenden Sie den richtigen Klassenspezifizierer - MyClass.MethodName , da MethodName die Klassenfunktion
istDieser Code funktioniert auf D7 und XE3:
%Vor%P.S. Welche Delphi-Version verwenden Sie? Was ist mit Extended RTTI (seit D2010)?
Tags und Links reflection delphi rtti delphi-xe4