logotipo Blog Giovani Da Cruz
Delphi

Explorando Propriedades de uma Classe em Delphi com RTTI

4 min de leitura 90 visualizações
Utilizando a RTTI no Delphi
Vamos percorrer as propriedades de uma classe através da RTTI do Delphi

Introdução

Em Delphi, o RTTI (Run-Time Type Information) é uma ferramenta poderosa que permite acessar metadados das classes em tempo de execução. Isso inclui propriedades, métodos e outras informações importantes. Neste post, vamos explorar como usar RTTI para percorrer as propriedades públicas, privadas, protegidas e publicadas de uma classe, utilizando um projeto de console como exemplo.

 

O Projeto

A seguir, apresentamos um projeto console em Delphi que percorre as propriedades de uma classe, filtrando-as com base na sua visibilidade:

(*

Criado por Giovani Da Cruz
https://giovanidacruz.com.br

*)
program GetPropertysClass;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.Rtti,
  System.TypInfo,
  System.SysUtils;

type
  TMinhaClasse = class
  private
    FNome: string;
    FIdade: Integer;
    FSalario: Double;
    FPropPrivate: Integer;
    FPropProtected: Integer;
    // Propriedades private e protected
    property PropPrivate: Integer read FPropPrivate write FPropPrivate;
  protected
    // Propriedades protected não listam no GetProperties
    property PropProtected: Integer read FPropProtected write FPropProtected;
  public
    // Propriedades public
    property Nome: string read FNome write FNome;
    property Idade: Integer read FIdade write FIdade;
  published
    // Propriedades published
    property Salario: Double read FSalario write FSalario;
  end;

procedure PercorrerPropriedades(AObj: TObject; aTypes: array of TMemberVisibility);
var
  ctx: TRttiContext;
  rttiType: TRttiType;
  prop: TRttiProperty;
  value: TValue;
  isInArray: Boolean;
  visibility: TMemberVisibility;
begin
  ctx := TRttiContext.Create;
  try
    rttiType := ctx.GetType(AObj.ClassType);
    for prop in rttiType.GetProperties do
    begin
      isInArray := False;
      for visibility in aTypes do
      begin
        if prop.Visibility = visibility then
        begin
          isInArray := True;
          Break;
        end;
      end;

      if isInArray then
      begin
        value := prop.GetValue(AObj);
        Writeln(Format('%s = %s', [prop.Name, value.ToString]));
      end;
    end;
  finally
    ctx.Free;
  end;
end;

var
  Obj: TMinhaClasse;
begin
  Obj := TMinhaClasse.Create;
  try
    Obj.Nome := 'Giovani da Cruz';
    Obj.Idade := 30;
    Obj.Salario := 45100.75;

    Writeln('Propriedades "public" da classe TMinhaClasse:');
    PercorrerPropriedades(Obj, [mvPublic]);
    Writeln('');

    Writeln('Propriedades "published" da classe TMinhaClasse:');
    PercorrerPropriedades(Obj, [mvPublished]);
    Writeln('');

    Writeln('"Todas" Propriedades da classe TMinhaClasse:');
    PercorrerPropriedades(Obj, [mvPublished, mvPublic, mvProtected, mvPrivate]);
  finally
    Obj.Free;
  end;

  Readln; // Pausa
end.

 

Como Funciona?

Definindo a Classe

A classe TMinhaClasse contém propriedades com diferentes níveis de visibilidade:

  • private: Apenas visível dentro da própria classe.
  • protected: Visível para a classe e seus descendentes.
  • public: Visível para qualquer unidade que referencie a classe.
  • published: Similar a public, mas com RTTI adicional para ferramentas como o IDE.

 

Percorrendo as Propriedades

A função PercorrerPropriedades utiliza o RTTI para obter uma lista das propriedades da classe e seus valores. Para isso:

  • Criamos um contexto de RTTI com TRttiContext.
  • Obtemos as propriedades com rttiType.GetProperties.
  • Filtramos as propriedades de acordo com sua visibilidade (mvPublic, mvPrivate, etc.).

 

Exibindo Resultados

O código exibe as propriedades filtradas por visibilidade, demonstrando que o RTTI só acessa propriedades public e published.

 

 

Resultado Esperado

Ao executar o programa, teremos a seguinte saída no console:

Propriedades "public" da classe TMinhaClasse:
Nome = Giovani da Cruz
Idade = 30

Propriedades "published" da classe TMinhaClasse:
Salario = 45100.75

"Todas" Propriedades da classe TMinhaClasse:
Nome = Giovani da Cruz
Idade = 30
Salario = 45100.75

 

Pontos Importantes

Limitação do RTTI

O RTTI em Delphi só lista propriedades public e published. As propriedades private e protected não são acessíveis diretamente.

 

Uso do RTTI com Cuidado

Embora poderoso, o RTTI pode impactar o desempenho em grandes estruturas, e seu uso excessivo deve ser evitado em situações críticas.

 

 

Conclusão

O RTTI é uma ferramenta versátil para manipular metadados em Delphi, permitindo que desenvolvedores criem soluções dinâmicas e flexíveis. Com o exemplo apresentado, você pode aplicar esse conhecimento em projetos como serialização de objetos, geração automática de relatórios e criação de ferramentas de inspeção.

 

 

 

Gostou do conteúdo?

Ficou com alguma dúvida ou tem algo a acrescentar? 💬

Deixe seu comentário abaixo! 📢 Adoramos ouvir suas opiniões e trocar ideias com a comunidade. 🚀

 

 

💻 Não esqueça de compartilhar o post se ele te ajudou! 😊

 

 

📚 Obrigado por acompanhar até aqui! Explore outros posts relacionados no blog e continue evoluindo suas habilidades. Tem mais conteúdos sobre diversos assuntos te esperando! 👩‍💻 🔍✨

Até o próximo post. Valeu! 👋📖

 

 

#Delphi #Programação #RTTI #DesenvolvimentoDeSoftware

#ProdutividadeDev #GiovaniDaCruz

Deixe um comentário

Seu e-mail não será publicado.