Illustrates the extensive runtime introspection capabilities of DWScript. This example showcases the use of 'TypeOf' and 'RTTIRawAttributes' to explore class members (fields, properties, methods) at runtime, demonstrating how to dynamically inspect types and perform property access by name without compile-time knowledge.
<?pas
type
TStatus = (Active, Inactive, Pending);
type
TUser = class
private
FId: Integer;
published
Name: String;
Email: String;
Status: TStatus;
procedure Activate;
begin
Status := Active;
end;
function IsActive: Boolean;
begin
Result := Status = Active;
end;
end;
var typeID := TypeOf(TUser);
PrintLn('=== Type Info for ' + TUser.ClassName + ' ===');
PrintLn('');
// In DWScript, published members are exposed via the RTTI attributes system
var rtti := RTTIRawAttributes;
PrintLn('Published Fields/Properties:');
for var i := 0 to rtti.Length - 1 do begin
var attr := rtti[i];
if (attr.T = typeID) and (attr.A is RTTIPropertyAttribute) then begin
var prop := RTTIPropertyAttribute(attr.A);
PrintLn(' ' + prop.Name + ': ' + prop.Typ.Name);
end;
end;
PrintLn('');
PrintLn('Methods:');
for var i := 0 to rtti.Length - 1 do begin
var attr := rtti[i];
if (attr.T = typeID) and (attr.A is RTTIMethodAttribute) then begin
var meth := RTTIMethodAttribute(attr.A);
var kind := if meth.Typ.Name <> '' then 'function' else 'procedure';
PrintLn(' ' + kind + ' ' + meth.Name);
end;
end;
PrintLn('');
// Dynamic interaction
var user := TUser.Create;
user.Name := 'Alice';
// Find and use property dynamically
for var i := 0 to rtti.Length - 1 do begin
var attr := rtti[i];
if (attr.T = typeID) and (attr.A is RTTIPropertyAttribute) then begin
var prop := RTTIPropertyAttribute(attr.A);
if prop.Name = 'Name' then
PrintLn('Dynamic Name access: ' + VarToStr(prop.Getter(user)));
end;
end;
?>
=== Type Info for TUser === Published Fields/Properties: Email: String Name: String Status: TStatus Methods: procedure Activate function IsActive Dynamic Name access: Alice