如何在Delphi 10.1 Berlin中访问私有方法TStreamReader.FillBuffer?

时间:2016-06-17 06:13:00

标签: delphi delphi-10.1-berlin class-helpers

如何在Delphi 10.1 Berlin中访问私有方法TStreamReader.FillBuffer,我们在10.1之前使用类助手来完成它 - 但建议的解决方案不起作用:

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

它失败只是因为GetMethod返回NIL。任何想法为什么会失败?

编辑: 我确实想知道为什么会失败

1 个答案:

答案 0 :(得分:1)

它失败,因为私有方法不包含在此类中。 见RTTI access to private methods of VCL, e.g. TCustomForm.SetWindowState

有一种解决方法可以获取私有方法:

请参阅:How to access private methods without helpers?

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;