如何发布RTL单元的私有类功能?

时间:2015-08-01 05:54:13

标签: delphi

Delphi XE3,System.Rtti.pas

我需要访问两个私有类函数,但我已经读过如果我修改RTL单元的接口部分,那么我需要重新编译 all RTL。不适合胆小的人!

两个私有类函数在System.Rtti.pas中:

    class function GetName<T{: enum}>(AValue: T): string; reintroduce; static;
    class function GetValue<T{: enum}>(const AName: string): T; static;

System.Rtti.pas

  TRttiEnumerationType = class(TRttiOrdinalType)
  private
    function GetMaxValue: Longint; override;
    function GetMinValue: Longint; override;
    function GetUnderlyingType: TRttiType;
    constructor Create(APackage: TRttiPackage; AParent: TRttiObject; var P: PByte); override;
    {$HINTS OFF}
    function GetNames: TArray<string>;
    class function GetName<T{: enum}>(AValue: T): string; reintroduce; static;
    class function GetValue<T{: enum}>(const AName: string): T; static;
    {$HINTS ON}
  public
    property UnderlyingType: TRttiType read GetUnderlyingType;
  end;

2 个答案:

答案 0 :(得分:8)

您还可以使用类助手访问私有类方法。

program Project50;

{$APPTYPE CONSOLE}

uses
  System.SysUtils,RTTI;

Type
  TRttiEnumerationTypeHelper = class helper for TRttiEnumerationType
  public
    class function Name<T>(AValue: T): string; inline;
    class function Value<T>(const AName: string): T; inline;
  end;

class function TRttiEnumerationTypeHelper.Name<T>(AValue: T): string;
begin
  Result := TRttiEnumerationType.GetName<T>(AValue);
end;

class function TRttiEnumerationTypeHelper.Value<T>(const AName: string): T;
begin
  Result := TRttiEnumerationType.GetValue<T>(AName);
end;

Type
  TEnum = (teTest1,teTest2,teTest3);

begin
  WriteLn( TRttiEnumerationType.Name<TEnum>(teTest1));
  WriteLn( Ord(TRttiEnumerationType.Value<TEnum>('teTest1')));
  ReadLn;
end.

它的缺点是另一个帮助者可能隐藏此声明。要使用它,只需将声明放在一个单元中,并将单元包含在您需要的任何地方。

如果您想拥有这些功能的原始名称,请使用此处描述的技巧:Can I call static private class method with class helper?

答案 1 :(得分:2)

您的选择包括:

  1. 重新编译整个RTL。
  2. 使用RTTI访问私有方法。
  3. 向暴露功能的RTTI单元添加新类。我记得,在接口部分添加类型或功能不会强制重新编译RTL。
  4. 在RTTI单元外部自己实现功能。例如,请参阅此处的答案:Generic functions for converting an enumeration to string and back
  5. 如LURD的回答所述,使用班助手来破解私人。