如何访问类的私有属性?
下面以 TPathData 为例,它有一个私有属性 PathData,储存了每一个曲线点,但一般无法修改它,需要利用下面方法,才能访问修改(若有更好的方法,歡迎分享):
一、利用 RTTI 取得类私有属性:
= helper
PathData: TList<span style="color: #0000ff">function TPathDataHelper.PathData: TList<span style="color: #000000">;
<span style="color: #0000ff">var <span style="color: #000000"> Context1: TRttiContext;
Type1: TRttiType;
Field1: TRttiField;
<span style="color: #0000ff">begin<span style="color: #000000">
Context1 := TRttiContext.<span style="color: #0000ff">Create<span style="color: #000000">;
Type1 :=<span style="color: #000000"> Context1.GetType(TPathData);
Field1 := Type1.GetField(<span style="color: #800000">'<span style="color: #800000">FPathData<span style="color: #800000">'<span style="color: #000000">);
Type1: TRttiType;
Field1: TRttiField;
<span style="color: #0000ff">begin<span style="color: #000000">
Context1 := TRttiContext.<span style="color: #0000ff">Create<span style="color: #000000">;
Type1 :=<span style="color: #000000"> Context1.GetType(TPathData);
Field1 := Type1.GetField(<span style="color: #800000">'<span style="color: #800000">FPathData<span style="color: #800000">'<span style="color: #000000">);
</span><span style="color: #0000ff">if</span> Assigned(Field1) <span style="color: #0000ff">then</span><span style="color: #000000">
Result :</span>= Field1.GetValue(Self).AsObject <span style="color: #0000ff">as</span> TList<TPathPoint>
<span style="color: #0000ff">else</span> Result := <span style="color: #0000ff">nil</span><span style="color: #000000">;
<span style="color: #0000ff">end;
二、利用仿类将私有属性改成公有:
type
TPathDataHack = class(TInterfacedPersistent)
public
FOnChanged: TNotifyEvent;
FStyleResource: TObject;
FStyleLookup: string;
FStartPoint: TPointF;
FPathData: TList;
end;
TPathDataHelper = class helper for TPathData
public
function PathData: TList
end;
function TPathDataHelper.PathData: TList
begin
Result := TPathDataHack(Self).FPathData;
end;
三、直接使用 with Self do(此法最简单):(2017/09/04)
type
TPathDataHelper = class helper for TPathData
public
procedure SetPoint(const AIndex: Integer; const PathPoint: TPathPoint);
end;
procedure TPathDataHelper.SetPoint(const AIndex: Integer; const PathPoint: TPathPoint);
begin
with Self do // 必需使用 with Self do
FPathData[AIndex] := PathPoint;
end;
(感谢 [深圳]cjc 提供)