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;
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;
答案 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)
您的选择包括: