Delphi 有没有办法有效地访问记录的私有过程/功能?

Delphi 有没有办法有效地访问记录的私有过程/功能?,delphi,Delphi,在德尔福(东京),我们有: THashSHA2 = record private ... function GetDigest: TBytes; procedure Update(const AData: PByte; ALength: Cardinal); overload; public ... end; 有没有办法访问函数GetDigest/Update?不是通过RTTI,因为这会太慢。我需要一些快速的信息,比如程序是否公开。您实际上在这里

在德尔福(东京),我们有:

  THashSHA2 = record
  private
    ...
    function GetDigest: TBytes;
    procedure Update(const AData: PByte; ALength: Cardinal); overload;
  public
    ...
  end;

有没有办法访问函数GetDigest/Update?不是通过RTTI,因为这会太慢。我需要一些快速的信息,比如程序是否公开。

您实际上在这里提出了两个不同的问题:

  • 有没有办法有效地访问记录的私有过程/功能
  • 没有。没有通用且有效的方法访问(任何)私有proc/func

  • 有没有办法访问函数GetDigest/Update
  • 对。 可以/应该使用公共函数HashAsBytes代替GetDigest

    function HashAsBytes: TBytes; inline;
    
    可以/应该使用公共程序更新,而不是私人程序更新

    procedure Update(const AData; ALength: Cardinal); overload;
    
    procedure Update(const AData: TBytes; ALength: Cardinal = 0); overload; inline;
    
    procedure Update(const Input: string); overload; inline;
    

    闻起来像是XY问题我不会说这是个好的复制品。上面写着“没有助手”,这导致了RTTI。这个问题是为了避免RTTI,这不是实质性的区别。这里的问题更为具体,但被更为普遍的愚弄所涵盖。我也不会称之为“普遍愚弄”。这个问题特别要求不要使用RTTI。更重要的是,这里被接受的答案并不准确,因为你可以通过提到的泄漏做到这一点(我会发布一个,但不能)。@Victoria:副本的答案还包括其他不需要RTTI的方式。被接受的答案使用RTTI的事实并没有改变这一点;其他一些人没有。还提到了helper和内联的“with Self do”。这个解决方案根本不会造成任何开销。谢谢Andrei,这是我举的一个坏例子,因为是的,我们可以使用其他功能访问(感谢point it)。但是主要的想法是询问如何在一般情况下访问私有函数这里有一种方法,通过
    record helper
    您可以声明
    inline
    方法,该方法将在其实现中通过著名的leak
    调用私有方法,并使用Self-do-the-privateMethod@victoria,嗯,我不知道这个漏洞?安德烈:有。“TMethod”技巧和“with Self do”技巧都很有效。@Victoria:Marco Cantù的博客文章(由Marco Cantù撰写)是在几个版本之前,当主漏洞(使用助手类)被关闭时发表的。FWIW,您还可以在汇编器助手方法中访问私有方法。所以我找到了三个解决办法。所有这些都需要使用助手。我会在博客上介绍他们。