在 Delphi 中使用反射來清空一個類及其巢狀類的屬性是一個相對高階的技術。反射允許你在執行時動態地訪問物件的屬性和方法。以下是一個使用反射來清空類屬性的例子:
type
TAddress = class
Street: string;
City: string;
end;
TPerson = class
Name: string;
Age: Integer;
Address: TAddress;
end;
procedure ClearProperties(AObject: TObject);
var
Context: TRttiContext;
RType: TRttiType;
RProperty: TRttiProperty;
begin
Context := TRttiContext.Create;
try
RType := Context.GetType(AObject.ClassInfo);
for RProperty in RType.GetProperties do
begin
if RProperty.PropertyType.TypeKind = tkClass then
begin
// 如果屬性是類型別,遞迴清空
if Assigned(RProperty.GetValue(AObject).AsObject) then
ClearProperties(RProperty.GetValue(AObject).AsObject);
end
else
begin
// 對於非類型別的屬性,設定為預設值
case RProperty.PropertyType.TypeKind of
tkInteger, tkInt64:
RProperty.SetValue(AObject, 0);
tkFloat:
RProperty.SetValue(AObject, 0.0);
tkString, tkWString, tkLString, tkUString:
RProperty.SetValue(AObject, '');
else
// 對於其他型別,你可能需要特殊處理
end;
end;
end;
finally
Context.Free;
end;
end;
// 使用示例
var
Person: TPerson;
begin
Person := TPerson.Create;
try
Person.Name := 'John Doe';
Person.Age := 30;
Person.Address := TAddress.Create;
Person.Address.Street := '123 Main St';
Person.Address.City := 'Anytown';
// 使用反射清空 Person 物件
ClearProperties(Person);
// 此時 Person 的所有屬性都被清空
finally
Person.Free;
end;
end.
在這個例子中,ClearProperties
是一個遞迴函式,它接受一個 TObject
型別的引數,並使用反射來遍歷該物件的所有屬性。對於類型別的屬性,它會遞迴地呼叫 ClearProperties
來清空巢狀的物件。對於其他型別的屬性,它會將屬性設定為適當的預設值。