Delphi RTTI change the property value of an object that is owned by another

Asked

Viewed 98 times

0

I have the following

var vEstado : TEstado; 
begin
   vEstado := TEstado.Create;   
   vEstado.Codigo := 1;   
   vEstado.Nome := 'ESPIRITO SANTO';   
   vEstado.Sigla := 'ES';   
   vEstado.Pais.Codigo := 100;   
   vEstado.Pais.Nome := 'BRASIL';
end;

I would like to Change vState.Pais.Code to 200 via RTTI.

1 answer

0

After much research, I decided as follows:

procedure TOrmRtti<T>.AtribuirValorPropriedade(pObjeto: T; pPropriedade: string;
  pValor: TValue);
var
  vContexto : TRttiContext;
  vTipo: TRttiType;
  vPropriedade, vSubPropriedade: TRttiProperty;
  vPos : integer;
begin
  vContexto := TRttiContext.Create;
  try
    vTipo := vContexto.GetType(pObjeto.ClassInfo);
    vPos := Pos('.', pPropriedade);
    if (vPos > 0) then
      begin
        vPropriedade := vTipo.GetProperty(copy(pPropriedade, 0, vPos-1));
        vSubPropriedade := vPropriedade.PropertyType.GetProperty(copy(pPropriedade, vPos+1, Length(pPropriedade)));
        vSubPropriedade.SetValue(vPropriedade.GetValue(Pointer(pObjeto)).AsObject, pValor);
      end
    else
      begin
        vPropriedade := vTipo.GetProperty(pPropriedade);
        vPropriedade.SetValue(Pointer(pObjeto), pValor);
      end;
  finally
    vContexto.Free;
  end;
end;

Browser other questions tagged

You are not signed in. Login or sign up in order to post.