Hallo zusammen,
ich habe gerade eine recht lustige, wenn auch ernüchternde Entdeckung gemacht. Records sind ja recht nett in der Zwischenzeit. Sie unterstützen Konstruktoren, Methoden und Properties. Nun habe ich hier mal so ein Exemplar:
Delphi-Quellcode:
RInteger = record
private
FValue : Variant;
procedure SetValue(const AVar: Variant);
public
const VarType = varInteger;
property Value : Variant read FValue write SetValue;
function IsNull(): Boolean;
end;
Nachdem
RTTI ja auch ganz nett ist, habe ich mir mal eine Demo zu Testzwecken geschrieben, dir mir die Methoden und Properties aus dem Record ausgeben soll. Hier der Code:
Delphi-Quellcode:
var
context : TRttiContext;
typeInfo : TRttiType;
prop : TRttiProperty;
field : TRttiField;
attr : TCustomAttribute;
met : TRttiMethod;
begin
context := TRttiContext.Create();
try
typeInfo := context.GetType(System.TypeInfo(RInteger));
// Record?
if (typeInfo.IsRecord) then
Memo1.Lines.Add('Is Record');
// RInteger?
if (typeInfo.Handle = System.TypeInfo(RInteger)) then
Memo1.Lines.Add('RInteger found');
// Methoden auslesen, mit Parameteranzahl
for met in typeInfo.GetMethods do
Memo1.Lines.Add('Methods: ' + met.Name + '(' + IntToStr(Length(met.GetParameters)) + ')');
// Properties auslesen
for prop in typeInfo.GetProperties
do Memo1.Lines.Add('Property: ' + prop.Name);
// Felder auslesen
for field in typeInfo.GetFields do
Memo1.Lines.Add('Field: ' + field.Name);
// Attribute auslesen
for attr in typeInfo.GetAttributes do
Memo1.Lines.Add('Attribute: ' + attr.ClassName);
finally
context.Free;
end;
end;
Und hier die Ausgabe:
Code:
Is Record
RInteger found
Field: FValue
Aber irgendwas stimmt doch nicht? Es werden keine Properties ausgegeben, sondern nur das eine Feld.
Aber warum? Selbst wenn ich typeInfo.AsRecord mache und damit alle Get-Methoden aufrufe, bekomme ich das gleiche Ergebnis. Stimmt irgendwas nicht an meiner Programmierung, oder habe ich da ein
RTTI-Problem, welches ich nicht kenne/sehe?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)