TRttiMethod.GetParameters () не работает, когда метод имеет индексированное перечисление в качестве параметра - PullRequest
1 голос
/ 29 апреля 2020

Я использую Delphi 10.1 Berlin update 2. Ниже приведен код, который воспроизводит проблему:

uses
  System.SysUtils,
  Rtti;

type
  TEnum = (t1, t2);
  TIndexedEnum  = (to1=1, to2);

  TClass1 = class
    constructor Create(pEnum: TEnum);
  end;

  TClass2 = class
    constructor Create(pEnum: TIndexedEnum);
  end;

constructor TClass1.Create(pEnum: TEnum);
begin
end;

constructor TClass2.Create(pEnum: TIndexedEnum);
begin
end;

function MethodParamCount(pMethodName: String; pClass: TClass): Integer;
var
  rContext: TRttiContext;
  rType: TRttiType;
  FMethods: TArray<TRttiMethod>;
  I: Integer;
begin
  rContext := TRttiContext.Create;
  rType := rContext.GetType(pClass);

  FMethods := rType.GetMethods;
  for I := Low(FMethods) to High(FMethods) do
    if SameText(pMethodName, FMethods[I].Name) then
    begin
      Result := Length(FMethods[I].GetParameters);
      Exit;
    end;
  Result := -1;
end;

begin
  WriteLn(IntToStr(MethodParamCount('Create', TClass1))); // Prints 1
  WriteLn(IntToStr(MethodParamCount('Create', TClass2))); // Prints 0
  ReadLn;
end.

Это ошибка реализации RTTI или я что-то упустил? Есть ли способ обойти эту проблему без изменения реализации класса?

Редактировать: Я хочу найти конструктор без каких-либо параметров, чтобы я мог вызвать его с помощью Invoke(). Дело в том, что RTTI говорит мне, что для метода, у которого действительно есть параметр, нет параметров.

...