сначала вы должны создать TRttiContext
, а затем получить все загруженные классы, используя getTypes
. после этого вы можете фильтровать типы по TypeKind = tkClass
;
Следующий шаг - перечислить атрибуты и проверить, есть ли у них ваш атрибут;
атрибут и тестовый класс:
unit Unit3;
interface
type
TMyAttribute = class(TCustomAttribute)
end;
[TMyAttribute]
TTest = class(TObject)
end;
implementation
initialization
TTest.Create().Free(); //if class is not actually used it will not be compiled
end.
и найдите его:
program Project3;
{$APPTYPE CONSOLE}
uses
SysUtils, rtti, typinfo, unit3;
type TMyAttribute = class(TCustomAttribute)
end;
var ctx : TRttiContext;
t : TRttiType;
attr : TCustomAttribute;
begin
ctx := TRttiContext.Create();
try
for t in ctx.GetTypes() do begin
if t.TypeKind <> tkClass then continue;
for attr in t.GetAttributes() do begin
if attr is TMyAttribute then begin
writeln(t.QualifiedName);
break;
end;
end;
end;
finally
ctx.Free();
readln;
end;
end.
вывод Unit3.TTest
Вызовите RegisterClass, чтобы зарегистрировать класс в системе потоковой передачи .... Как только классы зарегистрированы, они могут быть загружены или сохранены системой потоковой передачи компонентов.
поэтому, если вам не нужна потоковая передача компонента (просто найдите классы с некоторым атрибутом), вам не нужно RegisterClass