Чтобы получить код, предоставленный для компиляции, я изменил следующее:
AbstractionField = class(TCustomAttribute)
end;
TCategory = class(TObject)
private
fName: String;
fParent: Integer;
fComment: String;
public
procedure Default;
protected
procedure Validate(Validation: Integer);
published
[AbstractionField]
property Name: string read fName write fName;
[AbstractionField]
property Parent: Integer read fParent write fParent;
[AbstractionField]
property Comment: String read fComment write fComment;
end;
Затем я написал следующий код, чтобы запросить видимость свойств:
var
C : TRttiContext;
T : TRttiType;
P : TRttiProperty;
begin
T := C.GetType(TCategory.ClassInfo);
for P in T.GetProperties do
begin
Memo1.Lines.Add(P.Name + ' ' +
GetEnumName(TypeInfo(TMemberVisibility),ord(P.Visibility)) );
end;
end;
Мои результаты, где (как и ожидалось):
Name mvPublished
Parent mvPublished
Comment mvPublished
Я также использую Delphi XE, вам придется предоставить больше кода, чтобы мы могли продублировать проблему.
Также убедитесь, что выпроверьте свои предупреждения на: [DCC Warning] UnitName.pas (LineNum): W1025 Неподдерживаемая языковая функция: 'настраиваемый атрибут'
Это единственный способ определить, если атрибут введен неправильно и не может быть найденкомпилятор.