Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 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.