2010-10-09 4 views
5

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

program ListAttrs; 

{$APPTYPE CONSOLE} 

uses 
    Rtti, 
    SysUtils; 

type 
    TPerson = class 
    private 
    FName: String; 
    FAge: Integer; 
    public 
    [NonEmptyString('Must provide a Name')] 
    property Name : String read FName write FName; 
    [MinimumInteger(18, 'Must be at least 18 years old')] 
    [MaximumInteger(65, 'Must be no older than 65 years')] 
    property Age : Integer read FAge write FAge; 
    end; 


procedure test; 
var 
    ctx  : TRttiContext; 
    lType  : TRttiType; 
    lAttribute: TCustomAttribute; 
    lProperty : TRttiProperty; 
begin 
    ctx  := TRttiContext.Create; 
    lType  := ctx.GetType(TPerson); 
    for lProperty in lType.GetProperties do 
    for lAttribute in lProperty.GetAttributes do 
    Writeln(lAttribute.ToString); 
end; 

begin 
    try 
    Test; 
    Readln; 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
end. 

ответ

5

Взгляните на свои предупреждения о компиляторе. Когда я это создаю, я вижу:

[DCC Warning] ListAttrs.dpr(15): W1025 Unsupported language feature: 'custom attribute' 
[DCC Warning] ListAttrs.dpr(17): W1025 Unsupported language feature: 'custom attribute' 
[DCC Warning] ListAttrs.dpr(18): W1025 Unsupported language feature: 'custom attribute' 

Это связано с исторической причудой. Компиляторы Delphi для .NET поддерживают атрибуты, и они широко используются в VCL для различных вещей .NET. Компилятор Delphi for Win32 должен был читать и игнорировать их.

Затем вышел Delphi 2010, и Delphi Win32 внезапно подтвердил атрибуты. Но все эти атрибуты .NET не существовали в Delphi. Вместо того, чтобы укоренять их всех, они заставили компилятор просто дать предупреждение, а затем проигнорировать их. (Кроме того, я считаю, что я слышал, что кто-то из Emb сказал, что Delphi для .NET по-прежнему используется внутри страны по какой-либо причине.)

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

+0

Большое спасибо Мейсон. – Salvador

+2

Чтобы добавить к этому, если вы хотите использовать пользовательские атрибуты в своем коде и предоставить им доступ к RTTI, вам необходимо явно определить классы атрибутов в вашем коде. В документации 2010 года по этой теме есть целая глава: ms-help: //embarcadero.rs2010/rad/Attributes_Index.html –