Неправильная информация о видимости RTTI и отсутствующие атрибуты - PullRequest
1 голос
/ 25 апреля 2011

У меня в сущности есть следующий класс в моем приложении

TCategory = class(TAbstractionTreeItem)
  private
    fName: String;
    fParent: Integer;
    fComment: String;
  public
    procedure Default; override;
  protected
    procedure Validate(Validation: TValidation); override;
  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;

Когда я сейчас пытаюсь получить информацию о расширенном RTTI в Delphi XE, я получаю в качестве информации о видимости для опубликованных свойств результат, который говорит мне, что они являются только общедоступными, а добавленные мной атрибуты вообще не отображаются.

Что там происходит? Я уже пытался проверить, что это правильный класс, который я пытаюсь проанализировать, и что принадлежащий ему модуль перекомпилируется, когда происходят изменения. Это, похоже, не проблема.

1 Ответ

5 голосов
/ 25 апреля 2011

Чтобы получить код, предоставленный для компиляции, я изменил следующее:

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 Неподдерживаемая языковая функция: 'настраиваемый атрибут'

Это единственный способ определить, если атрибут введен неправильно и не может быть найденкомпилятор.

...