Estou tentando recuperar informações RTTI para uma classe genérica instanciada usando o Delphi 12.2 Pro.
A documentação do Delphi afirma:
https://docwiki.embarcadero.com/RADStudio/Athens/en/Overview_of_Generics
Identificação do tipo de tempo de execução
No Win32, genéricos e métodos não têm informações de tipo em tempo de execução (RTTI), mas tipos instanciados têm RTTI.
Posso obter informações de RTTI para campos e propriedades de classes genéricas instanciadas. No entanto, não consigo obter RTTI para métodos. Abaixo está um código de exemplo. Estou esquecendo de algo ou isso é um bug?
program Project1;
{$M+}
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
System.Rtti;
type
TTestObject<T> = class
private
FValue: T;
function GetValue: T;
public
constructor Create(AValue: T);
property Value: T read GetValue;
end;
TIntegerObject = class(TTestObject<Integer>)
end;
{ TTestObject }
constructor TTestObject<T>.Create(AValue: T);
begin
FValue := AValue;
end;
function TTestObject<T>.GetValue: T;
begin
Result := FValue;
end;
var
t: TRttiType;
m: TRttiMethod;
o: TIntegerObject;
n: string;
begin
try
o := nil;
n := '?';
with TRttiContext.Create do
try
o := TIntegerObject.Create(10);
t := GetType(o.ClassType);
for m in t.GetMethods do
begin
if (m.name = 'GetValue') then
begin
n := m.Name;
break;
end;
end;
WriteLn('Name: ' + n); //writes "Name: ?"
ReadLn;
finally
o.free;
Free;
end;
except
on E: Exception do
begin
Writeln(E.ClassName, ': ', E.Message);
ReadLn;
end;
end;
end.
Você não está obtendo informações de RTTI para
GetValue
o método porque ele é declarado comoprivate
e a configuração padrão do Delphi RTTI não inclui métodos privados.Há a seguinte declaração na unidade do sistema que é então usada na diretiva do compilador RTTI para definir a configuração RTTI padrão.
Para alterar a visibilidade no seu código, você precisa usar a diretiva do compilador RTTI em cada unidade onde você deseja que elas sejam diferentes das padrões.
Por exemplo, usar o seguinte habilitará o RTTI para tudo e você obterá o RTTI para
GetValue
a função.Você pode encontrar mais informações sobre configurações específicas e como usar o RTTI na documentação oficial da Diretiva RTTI