【发布时间】:2016-11-01 21:46:51
【问题描述】:
我有一个名为aRttiProperty 的TRttiProperty 变量,它指向下面的属性:
Tsubscription = class(TMyObject)
private
fBilling: TMyObject;
public
property billing: TMyObject read fBilling; // << aRttiProperty point to this member
end;
现在,如何从aRttiProperty 中提取fBilling 对象指针?
我尝试这样做,但它不起作用:
function Tsubscription.getfBillingObj(const aRttiProperty: TRttiProperty): TMyObject
begin
Result := aRttiProperty.GetValue(Self).AsType<TMyObject>;
end;
它返回父 TSubscription 对象而不是 fbilling 字段对象。
【问题讨论】:
-
好吧,你可以使用
Result := MySubscriptionInstance.Billing;代替。 -
@Remy - 我的猜测是 Loki 想写信给这个领域。
-
@SertacAkyuz:如果他需要
fBilling字段本身的内存地址,则通过TRttiProperty不是正确的方法(除非您将其类型转换为TRttiInstanceProperty和然后解码其PropInfo^.SetProc值)。更好的选择是使用aRttiType.GetField('fBilling').Offset(其中aRttiType表示TSubscription类)获取Tsubscription类中fBilling字段的偏移量,然后将该偏移量添加到Tsubscription对象。 -
还有
FieldAddress取字段名,返回一个简单的指针,可以强制转换为TMyObject。 -
@UweRaabe:
TObject.FieldAddress()方法仅适用于声明为published的字段。在 OP 的示例中,fBilling被声明为private,因此SomeSubscriptionObject.FieldAddress('fBilling')将返回nil。