daizhengli

del88發表於2024-07-24

在 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 來清空巢狀的物件。對於其他型別的屬性,它會將屬性設定為適當的預設值。