Explorando Propriedades de uma Classe em Delphi com RTTI

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 apublic, 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