Как получить доступ к закрытому методу TStreamReader.FillBuffer в Delphi 10.1 Berlin?

Как получить доступ к приватному методу TStreamReader.FillBuffer в Delphi 10.1 Berlin, мы делали это с хелпером класса до 10.1 — но предложенное решение не работает:

uses System.Rtti;
procedure TForm1.FormCreate(Sender: TObject);
begin
  Assert(Assigned(TRttiContext.Create.GetType(TStreamReader).GetMethod('FillBuffer')), 
    'Failed');
end;

он терпит неудачу только потому, что GetMethod возвращает NIL. Любые идеи, почему это не удается?

Отредактировано: Я хочу знать, ПОЧЕМУ это не удается


person cydo    schedule 17.06.2016    source источник
comment
Вероятно, он не работает, потому что он не был скомпилирован с включенным расширенным RTTI.   -  person Rudy Velthuis    schedule 17.06.2016
comment
Вы видели ответ @LURD здесь: stackoverflow.com/questions/36716363/   -  person MartynA    schedule 17.06.2016
comment
@Rudy: я пытался добавить {$METHODINFO ON} в свой unit1.pas, но я думаю, что это нужно сделать в system.classes (где объявлен TStreamReader).   -  person cydo    schedule 17.06.2016
comment
@MartynA: TMethod(P).Code := @TStreamReader.FillBuffer работает, спасибо, пожалуйста, добавьте в качестве ответа   -  person cydo    schedule 17.06.2016
comment
Рад, что это сработало, но я думаю, что было бы лучше, если бы вы добавили свой собственный ответ, так как я не знаю, какой именно код вы в конечном итоге использовали.   -  person MartynA    schedule 17.06.2016
comment
Нам не нужно повторять ответы на один и тот же вопрос @MartynA, правильно закрывать как дубликат.   -  person David Heffernan    schedule 17.06.2016
comment
@DavidHeffernan: Хорошо, но я не уверен, что это дубликат. ОП запрашивает, чтобы GetMethod возвращал NIL. Любые идеи, почему это не удается? к которому другой q не обращается и не отвечает, afaics.   -  person MartynA    schedule 17.06.2016
comment
@DavidHeffernan: приватные поля видны с помощью GetFields, а приватные методы — нет. Для этого класса нет $METHODINFO ON, который был бы ответом на вопрос, который я думаю.... поэтому это не дублирующий вопрос   -  person cydo    schedule 17.06.2016
comment
См. также доступ RTTI к частным методам VCL, например. TCustomForm.SetWindowState.   -  person LU RD    schedule 19.06.2016


Ответы (1)


Это не удается, потому что частные методы не включены в этот класс. См. Доступ RTTI к частным методам VCL, например. TCustomForm.SetWindowState

Однако есть обходной путь для получения частного метода:

См.: Как получить доступ к закрытым методам без помощников?

type
  TStreamReaderHelper = class helper for TStreamReader
  public
    procedure FillBuffer(var Encoding: TEncoding);
  end;

procedure TStreamReaderHelper.FillBuffer(var Encoding: TEncoding);
var
  Method: procedure(var Encoding: TEncoding) of object;
begin
  TMethod(Method).Code := @TStreamReader.FillBuffer;
  TMethod(Method).Data := Self;
  Method(Encoding);
end;
person cydo    schedule 17.06.2016