Можно ли использовать атрибуты в аргументах метода Delphi?

Является ли этот код действительным с более новыми версиями Delphi?

// handle HTTP request "example.com/products?ProductID=123"
procedure TMyRESTfulService.HandleRequest([QueryParam] ProductID: string);

В этом примере аргумент ProductID имеет атрибут [QueryParam]. Если это действительный код в Delphi, также должен быть способ написать код на основе RTTI для поиска информации о типе атрибута аргумента.

См. мой предыдущий вопрос Какие языковые элементы могут быть аннотированы с помощью функции языка атрибутов Delphi?, в которой перечислены некоторые языковые элементы, которые, как сообщается, работают с атрибутами. В этом списке отсутствовали атрибуты аргументов.


person mjn    schedule 09.04.2014    source источник
comment
К сожалению, документация неверна. В нем говорится: Следующие блоки кода иллюстрируют различные языковые конструкции, допускающие аннотации. После объявления полного перечисления языковых конструкций он дает неполный список.   -  person David Heffernan    schedule 09.04.2014


Ответы (1)


Да, ты можешь:

program Project1;

{$APPTYPE CONSOLE}

uses
  Rtti,
  SysUtils;

type
  QueryParamAttribute = class(TCustomAttribute)
  end;

  TMyRESTfulService = class
    procedure HandleRequest([QueryParam] ProductID: string);
  end;

procedure TMyRESTfulService.HandleRequest(ProductID: string);
begin

end;

var
  ctx: TRttiContext;
  t: TRttiType;
  m: TRttiMethod;
  p: TRttiParameter;
  a: TCustomAttribute;
begin
  try
    t := ctx.GetType(TMyRESTfulService);
    m := t.GetMethod('HandleRequest');
    for p in m.GetParameters do
      for a in p.GetAttributes do
        Writeln('Attribute "', a.ClassName, '" found on parameter "', p.Name, '"');
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.
person Stefan Glienke    schedule 09.04.2014
comment
+1 - Эти атрибуты мощные, но плохо документированы :( - person Sir Rufo; 09.04.2014